java/swing从子线程打印文本

wswtfjt7  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(281)

我显示了一个摆动框架,带有一个开始线程的按钮:

public class Frame extends JFrame {
    private static Frame frame= null;
    public static Frame getFrame(){
        return frame== null? frame= new Frame(): frame;
    }

    Thread worker;
    JTextArea  textarea = new JTextArea();
    JButton b = new JButton();

    Frame(){
        frameinstance = this;
        b.addActionListener(actionEvent -> {
            worker = new Thread(new myWorker());
            worker.start();
        });
        //...
    }
}

线程看起来像:

public class myWorker implements Runnable {
    public void run(){
        //Do some work
        Frame.getFrame().textArea.append("Some work has been done");
        //Do some work
       Frame.getFrame().textArea.append("Some work has been done");
        //etc...
    }

}

但文本实际上并没有随着工作的进展而出现。

pprl5pva

pprl5pva1#

swing组件应该只在事件调度线程上更新。大多数swing组件都不是线程安全的,在其他线程中更新它们可能会有不可预知的行为。
您可以使用swingutilities.invokelater(计划更新并继续)或swingutilities.invokeandwait(在处理事件之前阻止)来更新ui。
例如:

SwingUtilities.invokeLater(()->Frame.getFrame().textArea.append("Some work has been done"));

相关问题