mav*_*mav 0 java swing multithreading jtable event-dispatching
我有jtable的问题.
我有许多线程,每个线程都必须向jTable添加一行,但表格仍为空.我正在使用netbeans,图形完全独立于逻辑.有谁可以帮助我吗?
这是我用来添加行的代码
MainGui.java
public void addToTable(String from, String to, int request, int response, String timeElapsed) {
Object [][] temp = new Object [data.length + 1][5];
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < 5; j++) {
temp[i][j] = data[i][j];
}
}
temp[data.length][0] = from;
temp[data.length][1] = to;
temp[data.length][2] = request;
temp[data.length][3] = response;
temp[data.length][4] = timeElapsed;
data = temp;
table.setModel(new DefaultTableModel(data, columnName));
}
Run Code Online (Sandbox Code Playgroud)
MyThread.java
public void run() {
try {
MainGui mg = new MainGui();
mg.addtotable("null", "null", 0, 0, "null");
} catch (Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
Swing的第一条规则 - 不要从事件调度线程以外的任何线程修改UI
首先,确保您的更新调用是同步的,使用SwingUtilities#invokeLater或者如果更新对代码路径至关重要SwingUtilities#invokeAndWait
向表模型添加行时,您负责触发通知视图模型已更改所需的更新事件.
如果你正在使用a DefaultTableModel那么这将为你完成,如果你使用的是AbstractTableModel你自己的,TableModel那么你需要自己做.
最简单的方法是编写一个从add方法扩展AbstractTableModel和调用的实现AbstractTableModel#fireTableRowsInserted(int, int),这将告诉JTable模型已添加行并将导致表自动更新.
不要被愚弄,使用fireTableRowsInserted通常比fireTableDataChanged在向表模型添加行时使用更快,因为整个表不需要重新绘制.如果您已经显着更改了表(添加/删除/更新了许多行),那么fireTableDataChanged将比单个插入/删除/更新的系列调用更快.
更新
因为看起来我可能没有说清楚.该模型负责解雇事件.这意味着,在你的add方法中,你应该调用fireTableRowsInserted.您应该避免从外部源调用这些方法.
| 归档时间: |
|
| 查看次数: |
4711 次 |
| 最近记录: |