java - 在 Action 事件期间在标签中设置文本

标签 java swing text jbutton jlabel

<分区>

Possible Duplicate:
several times change label text by clicking button in swing not work

我正在使用 Java Swing 开发一个 GUI,我在其中使用两个组件 JButton 和 JLabel。 JLabel 的文本最初设置为“单击按钮”。单击按钮后,我希望 JLabel 的文本更改为“Processing”。最后更改为“Processed”

因此,当我单击按钮时,控件将转到 ActionPerformed,其中我已使用 setText() 方法将 JLabel 的文本设置为“Processing”。 ActionPerformed 中的最后一条语句是使用 setText() 将 JLabel 的文本设置为“已处理”。

当我运行程序时,标签显示“单击按钮”。最后它变为“已处理”。但是,它从不显示“正在处理”。

最佳答案

因为它现在不工作的原因是处理 GUI 刷新的 Java 线程也处理监听器的事件。因此,当您调用 setText() 方法时,它会告诉 GUI 线程(称为事件调度线程的 EDT)更新组件,但现在无法完成,因为 EDT 当前在actionPerformed() 方法执行您的代码。

所以我认为您应该将执行任何工作的代码放在一个新线程中并更改 JLabel 的文本。因此 EDT 在 actionPerformed() 中启动它,然后在 JLabel 的文本更改时自由更新 GUI。

像这样:(你必须实现 run 方法)

public void actionPerformed(ActionEvent e) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            myLabel.setText("Processing");
            //Do the job
            myLabel.setText("Processed");
        }     
    });
    t.start();
}

理想情况下,必须从 EDT 本身调用 setText() 方法和其他改变组件的方法,以避免错误……在我给你的示例中不是这种情况。如果您想这样做,请使用此方法:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        myLabel.setText("my text");
    }
});

关于java - 在 Action 事件期间在标签中设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13238618/

相关文章:

java - 在显示滚动条之前将内容缩小到 minSize

python - 收集子进程输出并在 python 中写入 excel

excel - 使用 VBA 删除文本(左侧或右侧),因此我只保留特定字符串

java - 存储库找到 3 条记录,结果列表返回 6 条记录

java - 非静态变量 this 不能从静态上下文 JFrame 中引用

java - 无法连接到 smtp 问题

java - 如何将 JButton 添加到 JFrame?

android - 如何在 Canvas 上使用默认的 Android 字体绘图?

java - 检查我是否理解基本的 Java 位运算

java - 在 JNA 中传递带有内存字段的结构