我对这个论坛有另一个问题。我正在用Java编写一个小应用程序,其中我有多个Threads。我有两个不同类的线程。我有一个专用于定义所有JFrame组件的线程( thread1 )。 (JPanels,JButtons,ActionListeners等)在另一个线程中,( thread2 )我正在检查变量( v )是否等于某个值。 ( 98 )当此变量确实更改为等于 98 时,相同的线程应该更新JLabel。 (我们暂时将此标签称为标签。)它没有。有什么我做错了。我已经尝试为类编写一个方法 - 声明了所有JFrame组件 - 它改变了 label 的文本,但是当我从 thread2 调用此方法时,它没有更新标签。我试过调用一个包含 thread1 的超类,但这似乎没有什么区别。另外,我一直在调用 repaint()方法,但这似乎没有帮助。
请让我知道如何从两个不同的主题更新这些JLabel。
提前致谢, 〜录音棚
代码:
的Class1:
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel("V does not equal 98 Yet...");
Thread thread1 = new Thread(){
public void run(){
panel.add(label);
frame.add(panel);
System.out.println("Components added!");
}
});
public void setLabelText(String text){
label.setText(text);
}
的Class1 = 2:
v = 0;
Thread thread2 = new Thread(){
public void run(){
while(v < 98){
System.out.println("V equals -" + v + "-.");
v ++;
}
Class1 otherClass = new Class1();
otherClass.label.setText("V is now equal to: " + v);
otherClass.repaint();
otherClass.setLabelText("V is now equal to: " + v);
otherClass.repaint();
}
});
答案 0 :(得分:9)
Swing 不线程安全。我再说一遍:不要在Event Dispatch Thread (EDT)
以外的任何线程上调用Swing对象上的任何方法如果要从多个不同的线程获取事件,并且希望它们直接影响Swing对象,则应使用:
// Note you must use final method arguments to be available inside an anonymous class
private void changeJLabel(final JLabel label, final String text) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myLabel.setText(text);
}
});
}