我显示了一个摆动框架,带有一个开始线程的按钮:
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...
}
}
但文本实际上并没有随着工作的进展而出现。
1条答案
按热度按时间pprl5pva1#
swing组件应该只在事件调度线程上更新。大多数swing组件都不是线程安全的,在其他线程中更新它们可能会有不可预知的行为。
您可以使用swingutilities.invokelater(计划更新并继续)或swingutilities.invokeandwait(在处理事件之前阻止)来更新ui。
例如: