有人能给我解释一下javaxswing方法吗?
我很难理解这个简单的代码:有人能给我解释一下javaxswing方法吗?,java,concurrency,invokelater,Java,Concurrency,Invokelater,我很难理解这个简单的代码: javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); 有人能解释一下它是如何工作的吗(简单地说,因为我是新手)?这个简短的代码就是其中的一部分 更具体地说,我有以下问题: “public void run”是否定义了新方法?如果是这样,为什么要在另一个方法中定义它(请参阅“较大的代码”以供参考)
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
有人能解释一下它是如何工作的吗(简单地说,因为我是新手)?这个简短的代码就是其中的一部分
更具体地说,我有以下问题:
- 新班级
- 在该类中有一个名为
的方法run
- 该类的新实例
在本例中,某些操作(
createAndShowGUI()
)需要在Swing线程中运行。在方法调用的中间,你不能“跳转”到另一个线程中,而是将一个对象(你创建的新实例)放置在队列中。当Swing线程准备就绪时,它将从队列中删除该对象并调用run
方法,该方法依次调用createAndShowGUI
。现在一切都在正确的线程中发生。我能给出的最短答案是:
Runnable
是Java中的一个接口,表示定义run
方法的类型。实现此接口的任何类都必须为run
提供实现<代码>可运行s表示将由系统其他部分执行的任务Thread
是一种众所周知的Runnable
当您有类似于newinterfacename(){//implementation}
的代码时,称为匿名类。匿名类的要点是创建一个实现接口类型的一次性类。这个类没有名字,因此我们再也不能引用它了。它只在这里使用
在不太了解Swing的情况下,它看起来像是
SwingUtilities.invokeLater()
接受一个Runnable
,我猜它会在以后调用它(可能在JavaDocs中描述了多久)。但是,您在这里将run
定义为另一个方法调用的原因是SwingUtilities
中的一些代码将在此Runnable
上调用run
方法;实际上,它所能知道的关于任何Runnable
的一切就是它定义了一个带有签名的方法public void run()
,因为这是Runnable
接口中定义的唯一方法
嗯,我想这毕竟不是很短。当您调用invokeLater时,您正在向它传递一个可运行的类型实例。Runnable是只声明一个方法“public void run()”的接口。 在简短代码的第1行中发生的事情称为“Annonymous内部类”——您正在创建一个Runnable实例,该实例只使用了一次,甚至没有命名它 InvokeLater将接收您的Runnable,而inside将执行以下操作
public static void invokeLater(Runnable r) {
// Wait for the correct time to run this
r.run()
}
这意味着调用器将决定何时调用run方法,从而运行createAndShowGUI
因为在Java中,还不能将方法作为参数传递给运行人员,所以您必须创建一个使用可运行实例的方法。虽然Swing通常是这样创建GUI的,但他们所做的只是告诉您“就这样做吧,我们稍后会解释原因”。我想他们是对的,因为细节有些复杂,对初学者没有帮助。但无论如何:
invokeLater
启动一个线程,该线程稍后将运行Runnable
类。runnable类是finnw通过new runnable{[…]}
临时创建的,必须根据runnable
接口指定public void run()
方法。在这种情况下,它所做的就是执行createAndShowGUI
方法。此代码使函数(createAndShowGUI())可以在另一个线程中调用。
如果您不知道线程是什么,最好阅读它,但无论如何,将其视为与其他代码同时执行的代码。另一个代码是这个Invoke()调用后面的行。
这在图形应用程序中非常常见,当其他代码响应用户操作时,运行代码来更新图形。
也就是说,我没有读过关于InvokeLater()的文档,也没有写过太多Java。正如“LumpN”所说,“这就是Swing通常创建GUI的方式”
更奇怪的是(对于新手来说)invokeLater()参数是以一种不知名的方式定义的——“在代码中”。这实际上是一件好事,因为这个类并没有什么新的简单之处。所有其他答案都解释了这件离奇的事情
因此:
1.是的。
2.您询问了原因,并要求不要获取太多的技术细节,但正如“yulkes”所说的,因为在Java中,您不能将方法作为参数传递,所以您必须构建这个类,像这样构建它很好。
3.通过我在第一段中总结的内容,您可以简单地阅读文档(只需在Google上搜索函数名),还可以了解“Google代码搜索”。关于invokeLater:Swing是一个单线程GUI工具包。有一个称为事件分派线程(EDT)的特殊线程,专门用于显示和更新Swing组件。invokeLater是一个帮助器方法,用于确保任何以某种方式修改GUI的代码只有在这个特殊EDT上运行时才会这样做。invokeLater方法将在将来的某个时间在事件分派线程上调用“run”方法中的代码。我假设createAndShowGUI方法