【问题标题】:Java.awt.EventQueue.invokeLater() : Can't understand the syntaxJava.awt.EventQueue.invokeLater() :无法理解语法
【发布时间】:2017-11-23 18:10:20
【问题描述】:

我了解 EventQueue.invokeLater() 是一个调用函数以使 Java Swing 组件线程安全。 另外,我知道这个函数的参数是一个带有实现 Runnable 的对象。 但是,我无法理解此函数调用的语法,即此调用 -

EventQueue.invokeLater(()-> {
        new Screen();
    });

这里,Screen() 是一个扩展 JFrame 的类。

public class Screen extends JFrame
{   
    Screen()
    {    
        setSize(1000, 1000);
        JPanel j1 = new Board();
        j1.setBounds(0,0,500, 500);
        JPanel j2 = new DiceModel();
        j2.setBounds(500, 0, 500, 500);
        add(j1);
        add(j2);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }   

    public static void main(String[] args) 
    {
        EventQueue.invokeLater(()-> {
            new Screen();
        });

    }
}

此代码按预期运行。 Board 和 DiceModel 是我定义的两个扩展 JPanel 的类。

调用

EventQueue.invokeLater( new Screen() );

给出 Screen 不是 Runnable 类型的对象的预期错误。

所以,我的问题是,invokeLater() 函数调用的语法是什么意思? 它是Java中的一种匿名函数调用吗?

【问题讨论】:

  • 这是一个 lambda 函数。问题可能重复,但我找不到目标。
  • 非常感谢!我正在寻找这样的帖子,但找不到。所以我自己问了这个问题。我现在将查找 lambda 函数
  • 从 java 8 开始,您可以使用 lambda 表达式用一种方法创建接口对象。接口Runnable有一个方法run,所以它是函数接口,可以用作lambda表达式
  • 非常感谢! @JaySmith
  • @julianff: 你可以answer your own question.

标签: java multithreading swing awt


【解决方案1】:

完整的 Swing 处理是在一个名为 EDT(Event Dispatching Thread)的线程中完成的。因此,如果您要在此线程中计算一些持久的计算,您将阻止 GUI。

这里的方法是在不同的线程中处理您的计算,以便您的 GUI 保持响应。最后,您想要更新您的 GUI,这必须在 EDT 内完成。现在 EventQueue.invokeLater 开始发挥作用。它在 Swings 事件列表的末尾发布一个事件(您的 Runnable),并在处理完所有先前的 GUI 事件后进行处理。

这里也可以使用 EventQueue.invokeAndWait。不同之处在于,您的计算线程会阻塞,直到您的 GUI 更新。所以很明显,这不能在 EDT 中使用。

仍然有 Java 代码可以从主线程简单地启动 JFrame。这可能会导致问题,但不会阻止 Swing。大多数现代 IDE 现在都会创建类似的东西来启动 GUI

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new NewJFrame().setVisible(true);
       }
    });
 }

【讨论】:

  • 非常感谢!但我已经知道了这么多。我只是不理解函数调用,因为我已经在问题中发布了。我现在明白了,它是一个 Lambda 函数调用
  • 使用别人的答案时请务必注明:stackoverflow.com/questions/22534356/…
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2017-11-23
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多