java swing,main方法中必要的调用

时间:2013-08-25 11:23:44

标签: java swing awt

在考试时,我偶然发现了java图形中的一些线条,这些线条对我来说并不是很清楚。所以我开始浏览并检查一些其他程序,他们没有这些线。

示例:

public static void main(String[] args){
  SwingUtilities.invokeLater(new Runnable(){//unknown
  public void run(){                        //lines
  JPanel panel = new DrawingPanel();
  ...
}

现在我知道Runnable和run必须处理线程,但我不知道为什么以及这两行如何工作

2 个答案:

答案 0 :(得分:1)

只能从在闭环处理重绘,GUI事件等中运行的Swing线程访问Swing对象。当应用程序启动时,它将在普通线程(而不是Swing线程)中启动。看起来很奇怪的行使用SwingUtilities来执行DrawingPanel构造函数,可能还有更多Swing线程中的代码。

直接从主线程实例化第一个GUI框架的代码也可以在实践中工作,如果它实际上是第一个被调用的方法(如预期的那样)。然而,这种“根本错误”的方法可能在以后在不同的机器下工作,如果有不同的调用之类的话。

答案 1 :(得分:1)

Swing是一个单线程框架。所有与UI的交互和更新都应该在事件调度线程的上下文中执行。

Java没有让main在EDT中执行的保证(我相信他们通常称之为主线程)。因此,您需要确保首先将任何UI代码同步到事件调度线程。

SwingUtilities.invokeLater,代表EventQueue.invokeLater。这基本上将Runnable实例发布到事件队列中,事件队列由事件调度线程处理。

在将来的某个时间,Runnable会从队列中弹出,而run方法会在EDT中执行

有关详细信息,请参阅Initial Threads

您还可以查看The Single Thread Rule in SwingEvent-Dispatching Thread Rules for Swing UIs了解更多信息