Idea rozwiązania:
1. Wyświetlamy JTable
2. Asynchronicznie, w wątku systemowym, dodajemy wiersze do modelu JTable'a (tym modelem jest obiekt klasy dziedziczącej po DefaultTableModelu).
Oto kod:
/**
* $Id$
*/
package pl.prv.wojsal.table;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
/**
* <pre>
* <ul>
* <li>Projekt: wsSwing
* <li>Klasa: WsPacjenciViewJTableAsynchronizm
* <li>Opis: Test na asynchroniczna aktualizacje tablemodela, a tym samym jTable.
* <li>Utworzono: 1 mar 2014, 10:23:02
* <li>author: (c) Wojciech Salata
* </ul>
* </pre>
*/
public class WsPacjenciViewJTableAsynchronizm {
public static void main(String[] args) {
WsPacjenciViewJTableAsynchronizm m = new WsPacjenciViewJTableAsynchronizm();
m.run();
}
private WsPacjenciTableModel dataModel;
/**
*
*/
private void run() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setBackground(Color.BLUE);
panel.setLayout(new BorderLayout());
this.dataModel = new WsPacjenciTableModel("lp", "Data", "Nazwisko", "Imię", "Status");
JTable table = new JTable();
table.setModel(dataModel);
JScrollPane jsp = new JScrollPane(table);
panel.add(jsp);
frame.setTitle("Lista zarejestrowanych pacjentów");
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setBounds(500, 200, 700, 300);
frame.setVisible(true);
runAsynchronicznaAktualizacjaTableModelu();
}
/**
* Asynchroniczne dodawanie wierszy do tabeli. Dodajemy wiersze do tablemodelu w watku systemowym.
*/
private void runAsynchronicznaAktualizacjaTableModelu() {
Thread th = new Thread(new Runnable() {
int lp = 0;
public void run() {
while (true) {
System.out.println("Bede dodawal wiersz lp=" + this.lp);
WsPacjenciModel wiersz = WsPacjenciDaoMock.getNewModel(this.lp++);
dataModel.addWiersz(wiersz);
System.out.println("Dodalem wiersz lp=" + this.lp);
try {
Thread.sleep(3 * 1000l);
} catch (InterruptedException e) {
System.out.println(e.getLocalizedMessage());
e.printStackTrace();
}
}
}
});
th.start();
}
}
=========================================================================
/**
* $Id$
*/
package pl.prv.wojsal.table;
import java.util.Date;
/**
* <pre>
* <ul>
* <li>Projekt: wsSwing
* <li>Klasa: WsPacjenciModel
* <li>Opis: Model wiersza tabeli.
* <li>Utworzono: 1 mar 2014, 10:58:52
* <li>author: (c) Wojciech Salata
* </ul>
* </pre>
*/
public class WsPacjenciModel {
private int lp;
private Date data;
private String imie;
private String nazwisko;
private boolean status;
public int getLp() {
return lp;
}
public void setLp(int lp) {
this.lp = lp;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
public String getImie() {
return imie;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getNazwisko() {
return nazwisko;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
===================================================================
/**
* $Id$
*/
package pl.prv.wojsal.table;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
/**
* <pre>
* <ul>
* <li>Projekt: wsSwing
* <li>Klasa: WsPacjenciTableModel
* <li>Opis: Model tablea.
* <li>Utworzono: 1 mar 2014, 10:29:24
* <li>author: (c) Wojciech Salata
* </ul>
* </pre>
*/
public class WsPacjenciTableModel extends DefaultTableModel {
/**
*
* @param nazwyKolumn
*/
public WsPacjenciTableModel(String... nazwyKolumn) {
super(nazwyKolumn, 0);
}
/**
* @param wiersz
*/
public void addWiersz(WsPacjenciModel wiersz) {
Vector rowData = new Vector();
rowData.add(wiersz.getLp());
rowData.add(wiersz.getData());
rowData.add(wiersz.getNazwisko());
rowData.add(wiersz.getImie());
rowData.add(wiersz.isStatus());
this.insertRow(0, rowData);
}
}
====================================================================
/**
* $Id$
*/
package pl.prv.wojsal.table;
import java.util.Date;
/**
* <pre>
* <ul>
* <li>Projekt: wsSwing
* <li>Klasa: WsPacjenciDaoMock
* <li>Opis: Klasa DAO - wersja mock, dla testow.
* <li>Utworzono: 1 mar 2014, 22:19:14
* <li>author: (c) Wojciech Salata
* </ul>
* </pre>
*/
public class WsPacjenciDaoMock {
private static String[] nazwiska = { "Ochódzki", "Jarząbek", "Talar", "Kloss", "Maliniak", "Karwowski", "Paszczywół" };
private static String[] imiona = { "Ryszard", "Wacław", "Andrzej", "Hans", "Roman", "Stefan", "Zenon", "Wojciech", "Donald" };
/**
* @param lp
* @return
*/
public static WsPacjenciModel getNewModel(int lp) {
WsPacjenciModel model = new WsPacjenciModel();
model.setData(new Date());
model.setImie(imiona[lp % imiona.length]);
model.setNazwisko(nazwiska[lp % nazwiska.length]);
model.setLp(lp);
model.setStatus((lp % 3) == 0);
return model;
}
}