【发布时间】:2013-04-26 00:21:28
【问题描述】:
我有一个扩展 JFrame 的主类。
我将面板添加到这个由 JTable 和其他 Swing 组件组成的框架实例中。
在“public static void main”这个主类中,我设置了swing事件调度线程。
我将面板添加到此实例框架,并启动:
this.setTitle("Test");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
等等……
到这里一切都好。
现在,对于 JTable,它有一个监听器,当点击一行时,它会打开一个类 InfoDialog 的新实例。
在这个 InfoDialog 中,我照常添加 Swing 组件。
我在 JDialog 中有另一个调度线程,如下所示:
class InfoDialog {
JDialog jd;
public void initGUI() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jd = new JDialog();
jd.setModalityType(ModalityType.APPLICATION_MODAL);
jd.setTitle("Buy");
jd.setDefaultCloseOperation(jd.DISPOSE_ON_CLOSE);
jd.pack();
jd.setLocationRelativeTo(null);
jd.setVisible(true);
}});
}
}
放置事件调度线程解决了我遇到的错误(可能是因为它先前阻塞了当前线程),我的问题是,这是正确的方法吗?
感谢您的建议。
【问题讨论】:
-
问:是什么错误导致您选择自己编写 .invokeLater()?问:您认为您的方法可能存在什么问题?郑重声明:不,我看不出你的所作所为有什么问题。恕我直言...
-
发生的事情是,当我单击行并设置 InfoDialog 的新实例时,我在此之后设置的属性和其他实例也与 InfoDialog 实例一起使用,这些实例仅在我关闭后才设置InfoDialog 实例。使用 InfoDialog 实例本身中的另一个事件调度线程,它会同时设置这些属性,否则当我尝试在 InfoDialog 的 UI 上执行操作时会引发错误,这些操作引用了其他不会设置的其他实例。希望这是有道理的。
-
另外,似乎在对话框上设置了 ModalityType.APPLICATION_MODAL 会发生这种情况,我必须使用调度线程。
-
如果modality type设置为null,它基本上可以在没有事件调度线程的情况下工作,但我不想要这种行为。
-
感谢您的评论。