gpt4 book ai didi

java - 线程和jtable

转载 作者:行者123 更新时间:2023-12-01 06:55:15 25 4
gpt4 key购买 nike

我的 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));
}

MyThread.java

public void run() {
try {
MainGui mg = new MainGui();
mg.addtotable("null", "null", 0, 0, "null");
} catch (Exception e) {
}

最佳答案

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

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

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

如果您使用的是 DefaultTableModel 那么这将为您完成,如果您使用的是 AbstractTableModel 或您拥有 TableModel那么您需要自己执行此操作。

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

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

看看How to Use TablesConcurrency in Swing了解更多信息

已更新

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

关于java - 线程和jtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com