我知道EventQueue.invokeLater()是一个调用函数,使Java Swing组件成为Thread-Safe。 另外,我知道这个函数的参数是一个带有实现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中的一种匿名函数调用吗?
答案 0 :(得分:0)
完整的Swing处理在一个名为EDT(Event Dispatching Thread)的线程中完成。因此,如果您要在此线程中计算一些持久的计算,则会阻止GUI。
此处的方法是在不同的线程中处理您的计算,以便您的GUI保持响应。最后,您需要更新GUI,这必须在EDT中完成。现在EventQueue.invokeLater发挥作用。它在Swings事件列表的末尾发布一个事件(您的Runnable),并在处理完所有以前的GUI事件后进行处理。
此处还可以使用EventQueue.invokeAndWait。区别在于,您的计算线程会阻塞,直到您的GUI更新为止。所以很明显,这不能在美国东部时间使用。
还有Java代码从主线程启动JFrame简单。这可能会导致问题,但不会阻止Swing。大多数现代IDE现在创建这样的东西来启动GUI
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}