只是一个关于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的对象上调用方法,是否适用相同的逻辑?
答案 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()。