我使用 invokeAndWait 因为我需要按顺序触发我的事件
无需使用 invokeAndWait()。你可以只使用invokeLater()。事件仍将按接收顺序执行。
各种 fireTableDataChanged() 方法。
您不应该调用 fireTableDataChanged。TableModel 将调用适当的 fireXXX() 方法。当您可能只更改几行时,为什么要重新绘制整个表格。如有必要,RepaintManager 会将多个绘制请求合并为一个。
编辑:
这是我躺在身边的一些代码。所有更新都在 EDT 上对模型进行,并且代码不会调用 fireXXX(...) 方法:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableThread extends JFrame
implements ActionListener, Runnable
{
JTable table;
DefaultTableModel model;
int count;
public TableThread()
{
String[] columnNames = {"Date", "String", "Integer", "Decimal", "Boolean"};
Object[][] data =
{
{new Date(), "A", new Integer(1), new Double(5.1), new Boolean(true)},
{new Date(), "B", new Integer(2), new Double(6.2), new Boolean(false)},
{new Date(), "C", new Integer(3), new Double(7.3), new Boolean(true)},
{new Date(), "D", new Integer(4), new Double(8.4), new Boolean(false)}
};
model = new DefaultTableModel(data, columnNames);
table = new JTable( model );
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setIgnoreRepaint(false);
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
JButton button = new JButton( "Start Thread to Update Table" );
button.addActionListener( this );
getContentPane().add(button, BorderLayout.SOUTH );
}
public void actionPerformed(ActionEvent e)
{
new Thread( this ).start();
table.requestFocus();
}
public void run()
{
Random random = new Random();
while (true)
{
final int row = random.nextInt( table.getRowCount() );
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
table.setValueAt( new Integer(count++), row, 2);
table.setRowSelectionInterval(row, row);
Object[] aRow = { new Date(), "f", row, new Double(123), new Boolean(true) };
model.addRow( aRow );
}
});
try { Thread.sleep(500); }
catch(Exception e) {}
}
}
public static void main(String[] args)
{
TableThread frame = new TableThread();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}
}
无论框架是可见还是最小化,CPU 都是一致的。
如果您需要更多帮助,请发布正确的SSCCE(如上面的代码)来演示问题。