java - 我可以从 Java 线程中更改标签文本吗?

标签 java multithreading swing jlabel

我对这个论坛还有另一个问题。我正在用 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/

相关文章:

java - 为什么两个不同的 java.util.UUID 对象比较相等?

c# - NUnit 3.X.X 异步测试

java - 如何将 JPanel 添加到 JFrame

java - 我设计了一个蜘蛛,但无法传递按钮单击时的值

java - 位图未在 ListView 中显示 : Images from SD Card

java - 从 Python 程序访问 Java RMI API

java - Box2D - 角色粘在物体的侧面

C++ map.erase() 导致不必要的平衡

c# - 时间限制 C# 中的方法

java - 无法控制 View 功能