是否应始终在EDT中启动JFrame

时间:2012-04-11 19:50:21

标签: java swing event-dispatch-thread

我的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线程才能启动这些新窗口? 感谢。

3 个答案:

答案 0 :(得分:4)

通常当你在按钮处理程序(即actionlistener)中时,它是调用它的EDT。您可以使用SwingUtilities.isEventDispatchThread

进行检查

答案 1 :(得分:3)

没有问题 - 每个动作处理程序都在EDT上运行。因此,如果您从这样的地方打开新的JFrame,就没有问题。

如果你在不同的线程中做了一些工作(例如计算),那么它很好,但是触摸UI的所有工作都必须在EDT上完成。这就是为什么我们有SwingWorkerinvokeLater

答案 2 :(得分:2)

我的答案是

  • 不是,您之前可以使用其内容准备JFrame,但对于EDT,有两个最重要的方法,

    1. JFrame#pack() // finalize & calculate used LayoutManager

    2. JFrame#setVisible(true) // display Container on the screen

  • Each button can launch a separate JFrame.不这样做,请改用CardLayout来切换视图,如果需要弹出窗口则只创建一个JFrame而另一个容器可能是{{3}只有