gpt4 book ai didi

JAVA - JTable & Model 的奇怪问题(可能是线程问题)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:45 26 4
gpt4 key购买 nike

我正在使用 2 个表 (JTable) 及其 DefaultTableModels。第一个表已经填充。为第一个表的每一行填充第二个表(使用 SQL 查询)。我的目的是将第一个表格的每一行与第二个表格的相应行一起导出到 Excel 文件中。

我正在使用 for(对于第一个表的每一行),在其中我在 Excel 文件中写入第一个表的一行,然后填充第二个表(对于第一个表的这一行),我从表中获取每一行(实际上是从它的模型中获取)并将其放入第一个表的当前行下的 Excel 文件中。这意味着如果我在第一个表中有 n 行,我将清除并再次填充第二个表 n 次。

所有这些代码都在一个单独的线程中调用。

问题是:一切都很好,只是我遇到了一些异常(exception)。奇怪的是我的结果没有任何错误。Excel 文件是完美的。

一些异常行是:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 0 >= 0在 java.util.Vector.elementAt(Vector.java:427)在 javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)在 javax.swing.JComponent.paint(JComponent.java:1017)在 javax.swing.RepaintManager.paint(RepaintManager.java:1220)在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)

我假设问题在于第二个表需要更多时间来填充,然后我才能尝试从中获取任何数据。这就是我在异常中看到 RepaintManager 和 paintDirtyRegions 的原因。我做的另一件事是我在 Debug模式下运行我的程序,并在第二个表的每个填充后放置一个断点。然后我按 F5 继续第二张表的每个人口,没有出现异常。节目无一异常(exception)地结束了。这是另一个重要的事实,它告诉我,也许在这种情况下,我给了表格足够的时间来填充它。

当然你会问我:

  • 如果您的程序运行良好,您为什么要关心异常?我想避免将来出现任何问题,并且想更好地了解 Java 和 Java GUI 以及线程。

  • 为什么要依赖 GUI 组件(及其模型)来获取信息,为什么不使用 SQL 查询重新创建填充表的结果集并从结果集中获取信息?那将是最好和正确的方法。事实上,我已经准备好表格代码,而且我更容易从中获取信息。但正确的方法是直接从数据库中获取所有内容。无论如何,我所做的提出了我的问题,回答它会帮助我了解更多关于 java 的东西。所以我发布了它。

最佳答案

除了以下几个方法调用外,Swing API 不是线程安全的:repaintrevalidateinvalidate。除非针对特定类另有说明,否则所有其他调用必须在事件调度线程上进行。

可以通过 SwingUtilities.invokeLater()SwingUtilities.invokeAndWait() 将此类调用处理从生成的后台/工作线程转移。

javax.swing package summary javadocs 中还有一些关于 JTable 和附加到它的实例的任何 TableModel 的具体讨论。 .两者都不是线程安全的,因此任何从它们访问数据的调用都必须在事件调度线程上执行。

这是您遇到异常的最可能原因,您在调试器中运行时遇到的不同行为是竞争条件的典型标志。也没有可靠的方法通过引入你自己的锁等来破解这个问题。从长远来看,这种做法总是会导致麻烦(例如 Swing 库深处的事件调度队列锁的死锁),因为 Swing 真的,真的是并非设计为线程安全的。

关于JAVA - JTable & Model 的奇怪问题(可能是线程问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3052704/

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