Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能给我解释一下javaxswing方法吗?_Java_Concurrency_Invokelater - Fatal编程技术网

有人能给我解释一下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();
   }
});
有人能解释一下它是如何工作的吗(简单地说,因为我是新手)?这个简短的代码就是其中的一部分

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

  • “public void run”是否定义了新方法?如果是这样,为什么要在另一个方法中定义它(请参阅“较大的代码”以供参考)
  • 如果“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方法