gpt4 book ai didi

java - 在 Guava 事件线程安全上更新 JTable 的模式

转载 作者:行者123 更新时间:2023-12-01 18:58:24 25 4
gpt4 key购买 nike

初步问题

如何构建 JTable,以便在触发 Google Guava 事件时更新它(并保证它是线程安全的)?

简单的方法是 model.setValueAt(aValue, row, column);

两个问题:

  • 使用JTableModel的标准数据结构,我不知道自己在哪一行。
  • 使用 JTableModel 的标准数据结构,我无法将此数据用于其他组件
  • 这不是线程安全的(我认为)

我曾想过更改 JTableModel 以使用 ConcurrentHashMap,但这似乎不是扩展它的预期目的。我觉得这是一条通往奇怪错误的途径。

我在这一切中感到非常迷失,如果你能提供一个我应该首先探索的指南,那将会有很大帮助。

更明智的问题

这些 Activity 不在 EVT 中。为了确保我运行了 SwingUtilities.isEventDispatchThread(),结果是 false。

我现在认为我应该做什么:

@Subscribe
public void handleMessage(DataStructure newInformation) {
// handle the information

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.setValueAt(...); // update table1
tableModel2.setValueAt(...); // update table2
}
});
}

如果我得到的信息完全独立于表格。我需要一种方法来知道信息与哪一行相关。
我始终可以循环浏览模型中的整个 vector ,但我正在寻找可以使用 map 或数组的解决方案。

最佳答案

对 Swing 组件的每次更改都必须在事件调度线程中完成。您可以通过调用 SwingUtilities.isEventDispatchThread() 来测试您是否处于事件调度线程中。 。如果返回 true,则可以直接修改模型。如果它返回 false,则必须在 EDT 中完成更新,方法是将其包装在使用 SwingUtilities.invokeLater() 执行的 Runnable 中。 (或SwingUtilities.invokeAndWait()):

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.setValueAt(...);
}
});

您没有说这个事件是什么,以及您的表格模型是什么,但是由于表格模型,您当然需要能够找到与该事件相对应的行和列你得到的事件。通常使用 AbstractTableModel,包装 List<SomeBean> 。使用列表的方法,您应该能够找到 SomeBean 的索引要更新的实例。

编辑:

正如我所说,定义表模型的典型方法是扩展 AbstractTableModel,并基于包装的 List 实现方法。但是,只要实现了表模型契约,就可以使用 Map 来代替 List,或者除了 List 之外还可以使用 Map,并向模型添加其他方法。该列表将用于实现方法 getValueAt() , getRowCount()等等,例如, map 可以快速找到列表中对象的索引。当然,您的工作是将所有内容封装到自定义表模型中,并保持两个集契约(Contract)步。

也就是说,我会采用一个简单的解决方案,即在列表上进行迭代以找到适当的行,并且仅在确实存在性能问题时才尝试优化(这可能只发生在大型表中)。维护这两个集合可能比简单地在列表上循环具有更大的开销。不要过早优化:这是万恶之源。

关于java - 在 Guava 事件线程安全上更新 JTable 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198394/

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