- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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 Tables和 Concurrency in Swing了解更多信息
已更新
看来我可能没有说清楚。该模型负责触发事件。这意味着,在您的 add 方法中,您应该调用 fireTableRowsInserted
。您应该避免从外部源调用这些方法。
关于java - 线程和jtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407418/
我是一名优秀的程序员,十分优秀!