我的Java应用程序主要生活在JFrame对象中。它的“文件”菜单有两个条目“打开”和 “关”。 “关闭”菜单项被禁用。它将由fileOpenActionPerformed启用 完成解析文件:
private void fileOpenActionPerformed(java.awt.event.ActionEvent evt) {
// (1) get file from JFileChooser
// (2) parse Contents
if(bContentsValid == true) {
this.fileClose.setEnabled(true);
}
由于解析需要很长时间,我想在一个单独的线程中考虑它。线程应该启用 完成后“关闭”菜单项。
传递一个JMenuItem引用的线程对我来说看起来很糟糕。任何设计建议?
注意:我想过使用一个包装对象同时包含JFrame和线程引用但是这样 打破了NetBeans IDE生成的大部分代码......
答案 0 :(得分:2)
在Runnable
中封装完成后操作,并将Runnable
传递给您的后台主题。
这会很方便,因为对于正确的实现,您的后台线程必须通过EventQueue.invokeLater
或SwingUtilities.invokeLater
安排UI操作,无论如何都需要Runnable
。
或者,您可以使用SwingWorker
实现整个后台活动。然后,您可以覆盖done()
方法并在其中包含启用的菜单项。