Allora come ti dicevo il problema sta nel far si che l'aggiornamento della tabella avvenga fuori dal EDT e quindi in un'altro Thread.
Ti posto un esempio banale di come fare.
codice:
package it.muia.testricchefacce;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class TestJTable extends JFrame {
public TestJTable() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
final DefaultTableModel model = new DefaultTableModel(new Object[][] { { 1, 1 }, { 2, 2 }, { 3, 3 } }, new Object[] {
"ID", "VALUE" });
final JTable jTable = new JTable(model);
JScrollPane pane = new JScrollPane(jTable);
this.add(pane, BorderLayout.CENTER);
JButton updateButton = new JButton("UPDATE");
updateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
UpdateWork updateWork = new UpdateWork(model);
updateWork.execute();
}
});
this.add(updateButton, BorderLayout.SOUTH);
this.pack();
this.setVisible(true);
}
class UpdateWork extends SwingWorker<TableModel, Object[]> {
private DefaultTableModel model;
public UpdateWork(DefaultTableModel model) {
this.model = model;
}
@Override
protected TableModel doInBackground() throws Exception {
for (int i = 0, value = 4; i < 10; i++, value++) {
publish(new Object[] { value, value });// produco la nuova riga da aggiungere
TimeUnit.SECONDS.sleep(2);// simulo un operazione pesante
}
return model;
}
@Override
protected void process(List<Object[]> chunks) {
for (Object[] row : chunks) {
model.addRow(row);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestJTable testJTable = new TestJTable();
}
});
}
}