为什么JavaSwing不允许来自ExecutorService线程的更改
我的JavaGUI管理有问题。我正在制作一个更新程序,但当我试图从ExecutorService线程编辑一些JText或JProgressbar时,什么都没有 为什么它坏了?这是我的管制员管制员:为什么JavaSwing不允许来自ExecutorService线程的更改,java,multithreading,swing,user-interface,Java,Multithreading,Swing,User Interface,我的JavaGUI管理有问题。我正在制作一个更新程序,但当我试图从ExecutorService线程编辑一些JText或JProgressbar时,什么都没有 为什么它坏了?这是我的管制员管制员: public class UpdateManager extends AppManager { private final List<Controller> controllers; @Getter private final ExecutorService worker;
public class UpdateManager extends AppManager {
private final List<Controller> controllers;
@Getter private final ExecutorService worker;
@Getter private final UserInterface form;
private boolean isEnd;
public UpdateManager() {
this.controllers = new ArrayList<>();
this.form = new Form(this);
this.worker = Executors.newCachedThreadPool();
}
@Override
public void start(Controller... controllers) {
form.initialize();
this.controllers.addAll(Arrays.asList(controllers));
for(Controller controller: controllers)
controller.start();
}
@Override
public void end(boolean dispose) {
if(isEnd) return;
for(Controller controller: controllers)
controller.end();
if(dispose) form.dispose();
isEnd = true;
}
}
修改我的GUI:
public void alreadyUpdated() {
content.getFirstLine().setText("");
content.getSecondLine().setText("Your client is already up-to-date!");
content.getPlayButton().setEnabled(true);
}
但是什么也没有。。我的gui没有改变!
谢谢尝试从另一个线程更新Swing数据结构时出现两个问题:
正如注释中已经指出的,您需要使用
invokeAndWait
或invokeLater
在Swing事件处理线程中进行更改。是否确实调用了alreadyUpdated
?结果的值是多少?另见。尽管这可能与问题无关,但您不应该同时更新Swing GUI。更新应该包装在对invokeLater
或invokeAndWait
的调用中。我确信调用了alreadyUpdated方法。谢谢你的回复
manager.getForm().alreadyUpdated();
public void alreadyUpdated() {
content.getFirstLine().setText("");
content.getSecondLine().setText("Your client is already up-to-date!");
content.getPlayButton().setEnabled(true);
}