Swing对话框布局:运行方法还是构造函数?

时间:2012-07-25 19:34:30

标签: java multithreading swing

当我启动我的Swing对话框布局时,是否在类的run方法中执行它会有所不同:


    public void run()
    {
        frame = new JFrame();
        ...
        frame.setVisible( true );
    }

或类构造函数?


    public MyClass
    {
        frame = new JFrame();
        ...
        frame.setVisible( true );
    }
    public void run()
    {
    }

由于

2 个答案:

答案 0 :(得分:4)

是的,这很重要,原因是你应该在Swing事件线程(事件调度线程或EDT)上调用大多数Swing代码,包括创建JFrame。为此,您通常在Runnable中创建Swing GUI,并通过调用类似以下内容的方式将Runnable排入事件线程:

SwingUtilities.invokeLater(new Runnable(){
  public void run() {
     // create your Swing GUI here
     frame = new JFrame();
     ...
     frame.setVisible( true );
  }
});

例外情况是API中记录的Swing方法调用是线程安全的,例如组件的repaint()方法。

答案 1 :(得分:3)

这是背景。正如@hovercraftfullofeels指出的那样,您需要确保所有UI代码都在EDT中执行,包括初始化。

如果你已经在EDT中运行,那么就不需要使用InvokeLater(除非你真的想要),否则你必须将呼叫重新同步回{ {1}}。

最好查看EDT