Java.awt.EventQueue.invokeLater():Can';我不懂语法
我知道EventQueue.invokeLater()是一个调用的函数,用于使Java Swing组件线程安全。 另外,我知道这个函数的参数是一个具有可运行实现的对象。 但是,我无法理解此函数调用的语法,即此调用-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(()-> {
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函数调用。请确保在使用其他人的答案时给予信任: