线程和jtable

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)

Mad*_*mer 7

Swing的第一条规则 - 不要从事件调度线程以外的任何线程修改UI

首先,确保您的更新调用是同步的,使用SwingUtilities#invokeLater或者如果更新对代码路径至关重要SwingUtilities#invokeAndWait

向表模型添加行时,您负责触发通知视图模型已更改所需的更新事件.

如果你正在使用a DefaultTableModel那么这将为你完成,如果你使用的是AbstractTableModel你自己的,TableModel那么你需要自己做.

最简单的方法是编写一个从add方法扩展AbstractTableModel和调用的实现AbstractTableModel#fireTableRowsInserted(int, int),这将告诉JTable模型已添加行并将导致表自动更新.

不要被愚弄,使用fireTableRowsInserted通常比fireTableDataChanged在向表模型添加行时使用更快,因为整个表不需要重新绘制.如果您已经显着更改了表(添加/删除/更新了许多行),那么fireTableDataChanged将比单个插入/删除/更新的系列调用更快.

有关更多信息,请查看如何在Swing中使用表并发

更新

因为看起来我可能没有说清楚.该模型负责解雇事件.这意味着,在你的add方法中,你应该调用fireTableRowsInserted.您应该避免从外部源调用这些方法.