任何人都能解释一下这个javax swing方法吗?

Rom*_*man 7 java concurrency invokelater

我无法理解这个简单的代码:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() {
      createAndShowGUI();
   }
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释一下它是如何工作的(简单来说因为我是新手)?这个简短的代码是这个更大的代码的一部分.

更具体地说,我有以下问题:

  1. "public void run"是否定义了一种新方法?如果是这种情况,为什么在另一种方法中定义它(参见"更大的代码"以供参考)?
  2. 如果"public void run"定义了一个新方法,那么定义一个只包含一行代码的方法(createAndShowGUI)的原因是什么?
  3. "invokeLater"有什么作用?这对我来说实际上是最复杂的问题.

我想再强调一次,我是一个新手,使用"特殊"和"技术"词语会产生更多问题.

如果您决定帮助我,请提前感谢您!

dan*_*ben 11

我能给出的最短答案是:

Runnable是Java中的一个接口,表示定义run方法的类型.任何实现此接口的类都必须提供实现run. Runnables表示要由系统的其他部分执行的任务. Thread是一个众所周知的Runnable.

当你有代码看起来像new InterfaceName() { //implementation },这称为匿名类.匿名类的要点是创建一个实现接口类型的一次性类.这个类没有名字,因此我们再也不能引用它了.它只在这里使用.

在不了解Swing的情况下,它看起来像SwingUtilities.invokeLater()接受了一个Runnable......好吧,我猜它稍后会调用它(稍后可能会在JavaDocs中描述多少).但是,你run在这里定义为另一个方法调用的原因是内部的一些代码SwingUtilities将调用此run方法Runnable; 实际上,所有它可能知道的Runnable是它定义了一个带签名的方法public void run(),因为这是Runnable接口中定义的唯一方法.

嗯,我想这毕竟不是太短.

  • 在invokeLater上:Swing是一个单线程GUI工具包.有一个称为事件调度线程(EDT)的特殊线程,专门用于显示和更新Swing组件.invokeLater是一种帮助方法,可以确保在这个特殊的EDT上运行时,以某种方式修改GUI的任何代码都只会这样做.invokeLater方法将在Event Dispatch Thread上的某个时间点调用"run"方法中的代码.我认为createAndShowGUI方法将创建,初始化和显示组件,因此它必须只能在EDT上运行. (5认同)

fin*_*nnw 6

这是一个匿名的内部阶级.

你定义了三件事:

  • 一个新的课程
  • run在该类中调用的方法
  • 该类的新实例

在此示例中,某些operation(createAndShowGUI())需要在Swing线程中运行.您不能在方法调用的中间"跳转"到另一个线程,因此您将一个对象(您创建的新实例)放在队列中.当Swing线程准备就绪时,它将从队列中删除该对象并调用您的run方法,然后调用该方法createAndShowGUI.现在一切都在正确的线程中发生.