Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Java.awt.EventQueue.invokeLater():Can';我不懂语法_Java_Multithreading_Swing_Awt - Fatal编程技术网

Java.awt.EventQueue.invokeLater():Can';我不懂语法

Java.awt.EventQueue.invokeLater():Can';我不懂语法,java,multithreading,swing,awt,Java,Multithreading,Swing,Awt,我知道EventQueue.invokeLater()是一个调用的函数,用于使Java Swing组件线程安全。 另外,我知道这个函数的参数是一个具有可运行实现的对象。 但是,我无法理解此函数调用的语法,即此调用- EventQueue.invokeLater(()-> { new Screen(); }); 这里,Screen()是一个扩展JFrame的类 public class Screen extends JFrame { Screen()

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

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() );
给出屏幕不是Runnable类型的对象的预期错误

那么,我的问题是,invokeLater()函数调用的语法含义是什么?
这是Java中的一种匿名函数调用吗?

完整的Swing处理是在一个名为EDT(事件调度线程)的线程中完成的。因此,如果您要在此线程中计算一些持久的计算,您将阻塞GUI

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

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

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

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

这是一个lambda函数。问题可能是重复的,但我找不到目标。非常感谢!我正在寻找这样一个帖子,但是没有找到。所以我自己问了这个问题。现在我将查找lambda函数。由于Java8,您可以使用lambda表达式通过一种方法创建接口对象。接口
Runnable
有一个方法
run
,因此它是功能接口,可以用作lambda表达式,非常感谢@JaySmith@julianff:你可以。非常感谢!但我已经知道了很多。我只是不理解函数调用,因为我已经在问题中发布了。我现在明白了,这是一个Lambda函数调用。请确保在使用其他人的答案时给予信任: