正确更新摆动组件

Jim*_*_CS 5 java 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());
Run Code Online (Sandbox Code Playgroud)

这个?

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());
            }
        });
Run Code Online (Sandbox Code Playgroud)

这是标准做法吗?

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

kle*_*tra 9

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

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

(重点是我的)

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

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


MBy*_*ByD 3

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