SwingUtilities.InvokeLater和ButtonListeners

时间:2018-10-26 05:40:27

标签: java swing awt

只是一个关于SwingUtilities.InvokeLater()的问题。

据我了解,每当我更新Swing接口时,都需要调用SwingUtilities.InvokeLater进入EDT。如果我试图通过按钮侦听器更新GUI,是否需要这样做,因为它们的按钮事件已经在EDT中了?

即,我必须。

    public void mouseClicked(MouseEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //GUI updates
        }
    });
}

或者我可以...

        public void mouseClicked(MouseEvent e) {
   //GUI updates        
}

此外,如果我在将更新GUI的对象上调用方法,是否适用相同的逻辑?

2 个答案:

答案 0 :(得分:1)

更新此消息: Swing事件处理代码在称为事件调度线程的特殊线程上运行。因此,所有组件(按钮,复选框,单选按钮等)操作都在EDT上处理。因此,无需在按钮操作中包含SwingUtilities.invokeLater(),因为它始终在EDT上运行。

事件分发线程上的任务必须快速完成;如果没有,则会备份未处理的事件,并且用户界面将变得无响应。

因此,如果您打算执行长时间运行的任务,这可能会影响某个动作中的GUI,则最好使用Worker Threads或Background Threads。

SwingWorker具有doInBackground(),done()和process()方法,可以很好地处理长时间运行的任务,而不会影响GUI。

通过下面的链接获取更多信息 Why does SwingUtilities.invokeLater() cause JButton to freeze?

What does SwingUtilities.invokeLater do?

https://www.javacodegeeks.com/2012/12/multi-threading-in-java-swing-with-swingworker.html

答案 1 :(得分:1)

  

每次更新Swing接口时,我都需要调用SwingUtilities.InvokeLater进入EDT

正确。这包括您更新组件模型的任何时间,因为这也会导致组件的重新粉刷。

  

如果我试图通过按钮侦听器更新GUI,是否需要这样做,因为它们的按钮事件已经在EDT中了?

再次正确。由于代码是在EDT上自动调用的,因此您无需使用invokeLater()手动将其添加到EDT。

如果您的代码在separate Thread上执行,并且该逻辑的一部分需要更新GUI组件,则通常使用SwingUtilities.invokeLater()。