【发布时间】:2011-02-01 03:51:48
【问题描述】:
Re: 在 Event-Dispatch 线程上创建 Swing 对象的要求。
我正在开发一个应用程序,其目的是监视和显示各种远程嵌入式服务器的状况。我对 Java 很陌生,我对 Swing 对象和 EDT 的要求的理解还不完整。
主 GUI 在 EDT 上以通常的方式启动,如下所示,
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
然后用户可以选择对应于一台或另一台远程机器的一个或多个菜单选项。这样的效果就是每次新建一个线程如下
new Thread(new VoterStatus(itemNumber)).start();
它调用 VoterStatus 的类“run”方法,该方法又创建一个带有 JFrame 的新窗口。新线程是 VoterStatus 类的一个实例,然后询问(TCP 等)指定的特定远程(itemNumber),收集各种信息位并在 JFrame 中显示它们。
可能存在与 VoterStatus 实例相对应的任意数量的此类线程,它们都会更新它们自己的窗口。这些不同的窗口/JFrame/任务之间没有数据共享。
这似乎工作得很好,但是安全吗?
我是否违反了在 EDT 上创建 Swing 组件的规则?
使用 SwingWorker 类会有好处吗?
如果 Java 程序员在此类问题上更有经验,我将不胜感激。
谢谢 史蒂夫
【问题讨论】:
-
您是否只使用 EDT 来启动主 GUI?如果是,那么一切都很好。但是,如果后续窗口也在 EDT 中创建,并且它们的创建时间足够长(即 > 200 毫秒),您的 GUI 将在新窗口创建期间冻结。
-
嗨 Rogach - cmets 似乎与其他几个答案略有不同,但如果确实如此,我更喜欢它。我在 EDT 上创建主 GUI,但其他窗口是在 EDT 中启动的线程上启动的。还有什么想法。谢谢史蒂夫
标签: java multithreading events swing dispatch