java - JTextField setText() 方法在 run() 方法中不起作用

标签 java multithreading swing

我在使用 JTextField 类的 setText() 方法时遇到问题。简而言之,它在下面的 CounterPanel 类中不起作用。它在 run() 方法中调用,并且不会更新文本字段。其余代码将运行(可以使用我留下的 println() 语句将其打印到控制台。

这些面板被添加到我也在下面包含的 MainWindow 类中。 MainWindow 中有 4 个 CounterPanel,每个 CounterPanel 都有自己的线程。正如我所说, run() 方法中的其余代码工作正常,所以有人可以告诉我哪里出了问题吗?

非常感谢。

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

public class CounterPanel extends JPanel implements Runnable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JLabel labelOne = new JLabel("Counter 1");
    private JTextField textFieldOne = new JTextField(3);
    private JLabel labelTwo = new JLabel("Counter 2");
    private JTextField textFieldTwo = new JTextField(3);

    private int counter;
    private String counterAsString = Integer.toString(counter);

    public CounterPanel() {
        this.setLayout(new MigLayout());
        this.setBorder(BorderFactory.createLineBorder(Color.black, 1));
        this.add(labelOne);
        this.add(textFieldOne);
        this.add(labelTwo);
        this.add(textFieldTwo);
    }

    @Override
    public void run() {
        while(counter < 100) {
            textFieldOne.setText(counterAsString);
            textFieldTwo.setText(counterAsString);
            System.out.println("Counter 1 = " + counterAsString + ", Counter 2 = " + counterAsString);
            counter++;
        }
        System.out.println("FINISHED");
    }

}




import java.awt.Color;

import javax.swing.*;

import net.miginfocom.swing.MigLayout;

public class MainWindow extends JFrame {

    private CounterPanel panel1 = new CounterPanel();
    private CounterPanel panel2 = new CounterPanel();
    private CounterPanel panel3 = new CounterPanel();
    private CounterPanel panel4 = new CounterPanel();

    private JLabel labelOne = new JLabel("A");
    private JLabel labelTwo = new JLabel("B");
    private JLabel labelThree = new JLabel("C");
    private JLabel labelFour = new JLabel("D");


    public MainWindow() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(new MigLayout());
        this.add(labelOne, "gapright 20px");
        this.getContentPane().add(panel1, "wrap");
        this.add(labelTwo);
        this.getContentPane().add(panel2, "wrap");
        this.add(labelThree);
        this.getContentPane().add(panel3, "wrap");
        this.add(labelFour);
        this.getContentPane().add(panel4);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args) {
        MainWindow window = new MainWindow();
        window.setLocationRelativeTo(null);
        window.runThreads();
    }

    public void runThreads() {
        Thread panelThread1 = new Thread(panel1);
        Thread panelThread2 = new Thread(panel2);
        Thread panelThread3 = new Thread(panel3);
        Thread panelThread4 = new Thread(panel4);

        panelThread1.start();
        panelThread2.start();
        panelThread3.start();
        panelThread4.start();
    }

}

最佳答案

问题是:

Swing 组件应该在 Event Dispatch Thread 上创建和操作通过 SwingUtilities.invokeXXX block 。

你不这样做。请阅读:

关于java - JTextField setText() 方法在 run() 方法中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14280833/

相关文章:

java.io.IOException : setDataSource failed 异常

python - 为什么 Python threading.Condition() notify() 需要锁?

java - 未记录的神秘类——垃圾,还是我不知道的设计模式?

java - Android/Java 日期格式化和分割

java - 当第一个对象在屏幕外时如何绘制另一个对象?

java - 按顺序运行3个线程java

在 Windows 上使用线程的 C Web 服务器

multithreading - 如何使用 g++ 在 64 位 Solaris sparc 上编译线程本地存储 (TLS)

Java Swing SearchBox 模型

Java - JFrame 控件中的变量