我可以从Java中的Thread更改标签的文本吗?

时间:2014-10-21 20:05:31

标签: java multithreading swing jlabel

我对这个论坛有另一个问题。我正在用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();
  }
});

1 个答案:

答案 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);
    }
  });
}