java - 为 JTable 构建并发 TableColumnAdjuster

标签 java swing concurrency jtable jtableheader

我复制了一个 TableColumnAdjuster 类,它似乎很受欢迎。 http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/

但是,我正在开发的 JTable 是动态的,并且可以有大量数据流入和流出(多达 30,000 条记录)。显然,当 TableColumnAdjuster 必须迭代每个单元格时,可能需要一段时间,并使 Swing 界面无响应。我尝试将 adjustmentColumns() 方法放在自己的线程上,但列开始疯狂且随机地调整大小。显然不是线程安全的。于是我开始对这个类进行逆向工程,将变量变成 volatile ,用并发 HashMap 替换 HashMap ,并将计算与 Swing invokeLater() 线程分开。

但是,没有任何效果,列的大小仍然在大幅调整。我开始怀疑 JTable 是否完全不是线程安全的。对于这样的任务,JTable 是否是线程安全的?是否有某种简单的、策略性的代码插入,可以使 adjustmentColumns() 安全地在单独的线程上运行?当 Swing 线程有 View 更新时与它交互?

最佳答案

不回答有关使代码线程安全的问题,因为它假设代码在 EDT 上执行。我不确定您将如何重构代码以使用 SwingWorkers,因为问题是您仍然可以在 TableColumnAdjuster 进行处理时更新 TableModel。

large amount of data flow in and out of them (as much as 30,000 records).

对于 30K 记录,在确定初始数据的初始宽度后,每列的宽度从一个记录到下一个记录是否会发生巨大变化?

我的意思是,如果您更改包含最大宽度的单元格,则在给定 30K 记录的情况下,下一个最大宽度只会低 1。那么你真的需要将宽度降低 1 吗?用户不会担心列宽是否不变,因为就他们而言,最大宽度可能是其他 30K 行中的任何一个。

因此,也许您可​​以使用 onlyAdjustLarger 属性。这应该只需要查看已更改的当前行以查看宽度是否需要增加。由于用户当前正在查看这一行,因此立即增加宽度是有意义的。

您需要为此修改tableChanged(...) 代码。您只需在 onlyAdjustLarger 属性为 false 时才调用它,而不是始终调用 adjustColumns()。在所有其他情况下,您只需要检查已更新的列和行。

关于java - 为 JTable 构建并发 TableColumnAdjuster,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875676/

相关文章:

java - 在数据模型之间转换时帮助消除样板文件的最佳方法

java - Event Dispatch Thread 究竟是什么时候启动的?

java - 执行查询后刷新JTable

java - Java GUI 开发的 future ?

java - Java 8 中 AtomicLong 类中与 CAS 相关的更改如何工作?

java - 在并发应用程序设计中使用 Lock 接口(interface)如何提供比使用 synchronize 关键字更高的性能?

java - 从 SQL 脚本生成带有 JPA 注释的 Java 类

java - 在 Java 8 中组合函数和谓词

java - JTable 行中的重复值

oracle - 可以读取查询导致 Oracle 中的行锁争用