在准备考试时,我偶然发现了java图形中的一些我不太清楚的线条。因此,我开始浏览和检查一些其他程序,它们没有这些行。
示例:
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){//unknown
public void run(){ //lines
JPanel panel = new DrawingPanel();
...
}现在我知道Runnable和run必须处理线程,但我不知道这两行代码为什么工作以及如何工作
发布于 2013-08-25 19:28:36
Swing对象只能从在闭环中运行的Swing线程访问,该线程处理重绘、GUI事件等。当您的应用程序启动时,它在普通线程(而不是Swing线程)中启动。看起来很奇怪的代码行使用SwingUtilities来执行DrawingPanel构造函数,可能还会在Swing线程中执行更多代码。
直接从主线程实例化第一个GUI框架的代码也可以在实践中工作,如果它真的是第一个被调用的方法(正如预期的那样)。然而,这是“根本错误的”方法,以后可能不会在不同的机器上工作,如果不同的调用等等。
发布于 2013-08-25 19:31:40
Swing是一个单线程框架。与UI的所有交互和更新都应在事件分派线程的上下文中执行。
Java不保证main是在EDT中执行的(我相信他们通常把它叫做主线程)。因此,您需要确保您的任何UI代码都先同步到事件调度线程。
SwingUtilities.invokeLater,EventQueue.invokeLater的代表。这基本上是将Runnable实例发送到事件队列中,该队列由事件分派线程处理。
在将来的某个时候,将从队列中弹出Runnable,并在EDT中执行run方法
有关详细信息,请参阅Initial Threads
您还可以查看The Single Thread Rule in Swing、Event-Dispatching Thread Rules for Swing UIs获取更多信息
https://stackoverflow.com/questions/18428471
复制相似问题