我对这个论坛还有另一个问题。我正在用 Java 编写一个小型应用程序,其中有多个线程。我有两个线程,它们属于两个不同的类。我有一个线程 (thread1) 专用于定义所有 JFrame 组件。 (JPanel、JButton、ActionListener 等)在另一个线程 (thread2) 中,我正在检查变量 (v) 是否等于某个值。 (98) 当此变量确实更改为等于 98 时,同一线程 应该更新 JLabel。 (我们暂时将此标签称为标签。)事实并非如此。我做错了什么吗?我尝试为类编写一个方法 - 声明所有 JFrame 组件 - 更改 label 的文本,但是当我从 thread2 调用此方法时,它不会更新标签。我尝试调用包含thread1的父类(super class),但这似乎没有什么区别。另外,我一直在调用 repaint() 方法,但这似乎没有帮助。
请让我知道如何从两个不同的线程更新这些 JLabel。
提前致谢, 〜雷恩
代码:
第一类:
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);
}
类1=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();
}
});
最佳答案
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);
}
});
}
关于java - 我可以从 Java 线程中更改标签文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495337/