我的swing应用程序有一个主窗口,有一个服务器按钮。这个JFrame在EDT上发布......
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame server = new JFrame();
server.setVisible(true);
server.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//Do other stuff here
}
});
每个按钮都可以启动单独的JFrame。
我不确定是否必须启动新的EDT线程才能启动这些新窗口? 感谢。
答案 0 :(得分:4)
通常当你在按钮处理程序(即actionlistener)中时,它是调用它的EDT。您可以使用SwingUtilities.isEventDispatchThread
进行检查答案 1 :(得分:3)
没有问题 - 每个动作处理程序都在EDT
上运行。因此,如果您从这样的地方打开新的JFrame
,就没有问题。
如果你在不同的线程中做了一些工作(例如计算),那么它很好,但是触摸UI的所有工作都必须在EDT
上完成。这就是为什么我们有SwingWorker
和invokeLater
。
答案 2 :(得分:2)
我的答案是
是的,所有更改,更新修改等都应在EventDispathThread上完成
是的,应在InitialThread
但
不是,您之前可以使用其内容准备JFrame
,但对于EDT
,有两个最重要的方法,
JFrame#pack() // finalize & calculate used LayoutManager
JFrame#setVisible(true) // display Container on the screen
Each button can launch a separate JFrame.
不这样做,请改用CardLayout来切换视图,如果需要弹出窗口则只创建一个JFrame而另一个容器可能是{{3}只有