Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaSwing不允许来自ExecutorService线程的更改_Java_Multithreading_Swing_User Interface - Fatal编程技术网

为什么JavaSwing不允许来自ExecutorService线程的更改

为什么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;

我的JavaGUI管理有问题。我正在制作一个更新程序,但当我试图从ExecutorService线程编辑一些JText或JProgressbar时,什么都没有

为什么它坏了?这是我的管制员管制员:

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数据结构时出现两个问题:

  • 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);
    }