我是Java的新手,在阅读了许多有关线程和swing的文章之后,我了解到所有Swing方法的调用都应该在EDT上完成,因为Swing并不是线程安全的。但是,在阅读有关EDT之前,我已经写了几个很长的Swing应用程序。而且我所有的应用程序都运行良好。所以我的问题是我的Swing应用程序默认是在EDT上运行还是在其他线程上运行,我很幸运没有与它们发生任何问题?例如,例如,如果我将JButton添加到JPanel或JFrame,或者仅调用JTextField Field.setText()
,这些操作是否默认在EDT上运行?如果答案是否定的,那么我是否必须通过调用显式发送所有Swing组件的方法实现以在EDT上运行SwingUtilities.invokeLater()
谢谢
我的Swing应用程序默认在EDT上运行的位置,还是在不同的线程上运行,我很幸运没有出现任何问题?
它们主要是在EDT上运行的。Ewing本身所做的所有绘画和更新都在EDT上。您在代码库中专门进行的任何未在EDT上进行的操作都是未在EDT上进行的代码。因此,这些操作将是诸如查询JLabel的文本,设置JLabel的文本或初始化JLabel本身之类的操作。
但是,您在代码库中实现的Swing执行的各种侦听器方法都是在EDT上执行的(只要Swing调用了它,而不是您自己)。因此,在这些方法中,您可以查询/修改Swing组件,但要记住以线程安全的方式正确地传入和传出提供给Swing组件或从Swing组件查询的任何数据。
例如,例如,如果我创建一个JButton并将其添加到JPanel或JFrame,这些操作是默认运行在EDT上还是否运行?
对象的初始化发生在您在其上创建对象的任何线程上,Swing对象的其余修改也是如此(例如将一个组件添加到另一个组件)。我不知道任何Swing组件的公共方法实现包装在它们自己的invokeNow()或invokeLater()调用中,因此最好假定所有操作发生在调用原始方法的任何线程上。
我必须通过调用SwingUtilities.invokeLater()显式发送我的所有Swing组件和方法以在EDT上运行
是的,或者invokeNow()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句