Java.awt.EventQueue.invokeLater():无法理解语法

时间:2017-06-21 02:32:47

标签: java multithreading swing awt

我知道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中的一种匿名函数调用吗?

1 个答案:

答案 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);
       }
    });
 }