首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwingUtilities.InvokeLater和ButtonListeners

SwingUtilities.InvokeLater和ButtonListeners
EN

Stack Overflow用户
提问于 2018-10-26 13:40:27
回答 2查看 110关注 0票数 2

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

据我所知,每当我更新我的Swing接口时,我都需要调用SwingUtilities.InvokeLater来访问EDT。如果我试图从按钮侦听器更新GUI,是否需要这样做,因为它们的按钮事件已经在EDT上了?

也就是说,我要不要..

代码语言:javascript
复制
    public void mouseClicked(MouseEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //GUI updates
        }
    });
}

或者我可以简单的说...

代码语言:javascript
复制
        public void mouseClicked(MouseEvent e) {
   //GUI updates        
}

此外,如果我在一个将更新GUI的对象上调用一个方法,同样的逻辑也适用吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-26 22:50:40

每当我更新我的Swing接口时,我都需要调用SwingUtilities.InvokeLater来访问

对,是这样。这包括任何时候更新组件的模型,因为这也会导致组件的重新绘制。

如果我试图从按钮监听器更新我的图形用户界面,是否需要这样做,因为它们的按钮事件已经在EDT上了?

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-10-26 14:13:50

更新此消息: Swing事件处理代码在称为事件分派线程的特殊线程上运行。因此,所有组件(按钮、复选框、单选按钮等)操作都是在EDT上处理的。因此,不需要在按钮操作中使用SwingUtilities.invokeLater(),因为它总是在EDT上运行。

事件分派线程上的任务必须快速完成;否则,未处理的事件将会备份,用户界面将变得无响应。

因此,如果您计划执行一个长时间运行的任务,这可能会影响操作内部的GUI,那么最好使用工作线程或后台线程。

SwingWorker有doInBackground()、done()和process()方法,可以很好地处理长时间运行的任务,而不会影响图形用户界面。

通过以下链接获取更多信息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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53002147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档