我一直在设置 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/