【发布时间】:2013-03-21 05:19:10
【问题描述】:
我有一个 JTable,我正在动态地向该 JTable 插入行。 经过一些用户干预后,将插入一个新行。然后我将调用一个函数,其参数为选定的行号,在该函数内部,我有一些代码将相应地更新同一行。每个行插入和行值更新代码将在单独的线程中运行。
public void updateRow(int row,JTable myTable)
{
String text = "";
//After lot of processing, setting the table cell value at the 'row' on the 4th column
myTable.setValueAt(text, row, 4);
}
我面临的问题如下,
如果用户删除任何行,那么行的位置将会改变,此时如果函数updateRow()试图更新其他行,那么它将因为行数的改变而失败。
假设我一次有 3 行,每行的 updateRow 正在进行中。
updateRow(0,userTable);//For the 1st row
updateRow(1,userTable);//For the 2nd row
updateRow(2,userTable);//For the 3rd row
并假设第二行的 updateRow() 已完成。这将导致第三行的 updateRow() 函数出现问题。因为,它的行值为 '2' 。由于第 3 行被删除,因此没有第 3 行,这反过来又导致以下代码失败
myTable.setValueAt(text, row, 4);//Currently, row has the value as '2'
任何人都可以建议我如何使用行值相应地跟踪行更新,即使行的位置动态更改?
提前致谢。
【问题讨论】:
-
“每个行插入和行值更新代码都将在单独的线程中运行” - 这是一个非常糟糕的主意。 Swing 不是线程安全的,您只能从事件调度线程的上下文中更新 UI
-
行中是否有可以唯一标识行的数据?如果是这样,那么您可以保存该标识符。然后,当需要更新您搜索表的行时,找到标识符的当前行。
-
@camickr :感谢您的评论。
-
Each row insertion and row value update code will run in a separate thread,那么线程或行不存在,取决于方向,使用基于util.List的AbstractTableModel,行索引只会减少,最简单的方法是按照建议使用唯一ID @camickr,那么添加或删除或修改一行都没有关系
标签: java multithreading swing concurrency jtable