繁体   English   中英

正确更新摆动组件

[英]Updating swing components correctly

我一直在为摆动组件设置值,就像我对任何其他变量一样,但是我遇到了这个页面 - https://bitguru.wordpress.com/2007/03/21/will-the-real-swing-single-threading -rule-please-stand-up / - 似乎我正在使用事件调度线程对swing组件进行所有更改 -

那么,这是否正确,我应该更改所有更新摆动组件的代码

    String name = this.getNameTextfield().getText();
    String password = new String(this.getPasswordField().getPassword());
    String confirmPassword = new String(this.getConfirmPasswordField().getPassword());

这个?

java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
               String name = this.getNameTextfield().getText();
               String password = new String(this.getPasswordField().getPassword());
               String confirmPassword = new String(this.getConfirmPasswordField().getPassword());
            }
        });

这是标准做法吗?

编辑:哎呀,只是复制并粘贴了一些与组件相关的代码,忽略了它没有更新组件的事实。

Swing圣经有一章关于并发 ,底线:

所有与Swing组件创建或交互的代码都必须在事件派发线程上运行

(重点是我的)

所以,是的,你必须确保所有访问,阅读或写作都在EDT上进行。

在光明的一面:一旦应用程序正确启动在美国东部时间,你已经它,几乎所有的访问自然发生在EDT。 只有当您明确启动另一个线程(用于执行冗长的后台任务)并且需要向ui报告时,情况并非如此:那么您必须将访问调用包装到invokeLater中(或者使用内部执行此操作的SwingWorker)

字符串是不可变的 - 以下几行几乎相同

String password = new String(this.getPasswordField().getPassword());
String password = this.getPasswordField().getPassword();

您没有修改组件。

如果您正在更新它们,那么只有更新来自另一个线程。 例如,如果您正在从附加到按钮的ActionListener更新文本字段,那么就没有必要,因为您已经在Event-Dispatch-Thread上。

为了获得最大的正确性,您应该确定您是否首先参加了EDT。

Runnable update = new Runnable() {
    @Override
    public void run() {
        getNameTextfield().setText("foo");
    }
};
if (SwingUtilities.isEventDispatchThread()) {
    update.run();
} else {
    SwingUtilities.invokeLater(update);
}

在这种特定情况下,您不需要修改任何组件,因此您不需要在EDT上执行此操作,但是当您修改UI时,第二种方法是正确的。

如果您只是从组件中读取数据,那么您可能不需要这样做。 Swing组件属性中的大多数读取都是线程安全的。

如果要在事件调度线程上运行代码,则应使用invokeLater,这通常是您实际需要更新GUI时的情况。

关于invokeLater的使用,这里有一个简短的小教程

为了让您的生活更简单并将问题的风险降至最低,我建议确保与Swing GUI交互的任何代码都在EDT上运行。 正如kleopatra正确地指出的那样,好消息是这种情况几乎是自动发生的,因为所有的事件处理代码都将由EDT调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM