java - 正确更新 Swing 组件

标签 java swing

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

那么,这是正确的吗,我是否应该更改我从中更新 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 圣经有一个 chapter on concurrency , 底线:

all code that creates or interacts with Swing components must run on the event dispatch thread

(重点是我的)

所以是的,您始终必须确保所有访问、读取或写入都发生在 EDT 上。

好的方面:一旦应用程序在 EDT 上正确启动,您就已经了,几乎所有访问都自然地发生在 EDT 上。仅当您显式启动另一个线程(例如执行冗长的后台任务)并需要向用户界面报告时,情况才不是这样:然后您必须将访问调用包装到 invokeLater 中(或使用在内部执行此操作的 SwingWorker)

关于java - 正确更新 Swing 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680629/

相关文章:

java - 用科学计数法格式化 double 值

java - 如何更改 Visual VM 中的默认设置?

java - JavaFX GUI 是否对性能影响很大?

Java JPanel 不可见

Java Flight Recorder 不报告任何文件 I/O 事件

java - bukkit 1.8 取消饮用和发射药水

java - JPA - 在模型中使用注解

java - 在显示主窗口之前打开配置对话框?

java - 调用重绘时简单的缓冲图像闪烁

java - JOptionPane.showInputDialog自动退出