我提前为这个问题道歉可能很难解释,但我试图包含必要的最少信息(我怀疑你想通过10个不同的类来阅读错误)
我一直在java中创建一个简单的(ish)应用程序,使用swing作为GUI。目前我有一个JTable,JList和一个JButton。在表格中双击行时,会将其添加到列表中。单击按钮时,自定义的fileVisitor将遍历(当前是硬编码的)目录,并使用它找到的文件填充表。该列表到目前为止没有任何作用这一切都按预期工作。
但是,单击该按钮时,整个应用程序将锁定大约15秒,然后运行fileVisitor。如果有点刺激,这很好。当文件树遍历结束时,应用程序再次响应(并且表一次更新所有行)。
所以我决定将Files.walkFileTree调用放在自己的线程中。起初这似乎是有效的,因为每个文件都被添加到表模型中,它反映在表中(设置为在模型更改时调用revalidate)。但是,如果我在文件树行走时双击一个项目,它会挂起消息:从线程“AWT-EventQueue-0”中的UncaughtExceptionHandler抛出java.lang.NullPointerException
稍微阅读了一下,我认为是因为我从一个不是AWT调度线程的线程编辑了表模型,并且迅速将编辑表模型的行放在SwingUtilities.invokeLater中(Runnable) )块。但是,这并没有解决问题。很奇怪(或者可能不是,对我来说似乎很奇怪),有时双击工作,并且只有在经过2或3次尝试后才会导致崩溃。
我的问题是:可能导致这种情况的原因是什么?我看不出其他任何明显错误的东西,我所有的谷歌搜索都指向Swings缺乏线程安全性,并使用AWT调度线程(我认为是invokeLater所做的)。谁知道什么是错的?
P.S。对不起,如果有什么不清楚,那就太长了:P
答案 0 :(得分:1)
结果有两个问题: 1)我正在使用一个线程进行文件树步行而不是一个摇摆工作者doInBackground; 2)我的双击代码实际上产生了一个空指针,但只有在表更新时才有正确的时间,我现在也修复了。谢谢你的期待。