默认情况下,所有Swing组件都在EDT上运行吗?

Gam*_*anA 4 java swing multithreading

我是Java的新手,在阅读了很多关于线程和swing的文章后,我明白所有Swing方法的调用都应该在EDT上完成,因为Swing不是线程安全的.但是,在阅读有关EDT之前,我已经编写了几个相当长的Swing应用程序.我的所有应用程序都运行得很好.所以我的问题是我的Swing应用程序默认运行在EDT上,还是在不同的线程上运行,我很幸运,没有任何问题?例如,如果我将JButton添加到JPanel或JFrame,或者我只是调用JTextField Field.setText(),那么默认情况下这些操作是否会在EDT上运行?如果答案是否定的,那么我是否必须通过调用显式发送我的所有Swing组件的方法实现以在EDT上运行SwingUtilities.invokeLater()

谢谢

Thi*_*ler 6

记住对象不在线程上,只在线程上执行方法.

来自swing组件的所有动作(通过听众)自动在EDT上运行.

例如,您单击一个按钮,该onClicked()功能将在EDT上运行,因此您无需执行任何操作.

如果你没有显式创建任何线程,你的基本应用程序将有一个主线程和一个EDT(以及许多其他线程,你不会意外地执行你的代码,直到你开始使用额外的框架).

你必须手动完成的事情是在EDT上构建GUI.正如您在此处所见,这可以在主线程中完成,如下所示:

   SwingUtilities.invokeLater(new Runnable() { 
        public void run() {            
            MyWindow window = new MyWindow ();
            window.setVisible(true);
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果您未能正确使用EDT.一切似乎都可以正常工作,但偶尔你会得到非常奇怪的行为(因为两个线程将做的事情而不是一个).

总而言之,您必须使用invokeLater(),或者在invokeNow()以下情况下使用某些例外情况:

  1. 从主线程构造Swing组件.
  2. 从您个人创建的线程中调用swing组件.
  3. 从框架创建的线程上的事件中调用swing组件.

这个问题包含一些可以帮助您自动检测错误的工具(尽管不是全部).