【问题标题】:Updating JTable row dynamically after the deletion successive rows删除连续行后动态更新 JTable 行
【发布时间】: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


【解决方案1】:

不要依赖视图的行号,而是直接对模型进行操作,正如@mKorbel 的评论中所建议的那样;如果您更改模型,视图将跟随。正如here 所讨论的,“JTable 提供了从模型坐标转换为视图坐标的方法——convertColumnIndexToViewconvertRowIndexToView——以及从视图坐标转换为模型坐标的方法——convertColumnIndexToModelconvertRowIndexToModel

【讨论】:

  • trashgod,无论如何它会在排序后返回正确的索引?但是在这里,就我而言,我没有对数据进行排序。很少有行项目可以随时删除
  • 是的,即使您排序也可以使用转换方法。如果您需要从另一个线程改变模型,请将调用包装在 invokeLaer() 中,用于 example
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多