在动作事件期间在标签中设置文本

use*_*043 3 java swing text jlabel jbutton

可能重复:
多次通过单击摆动按钮更改标签文本无法正常工作

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

因此,当我单击按钮时,控件转到ActionPerformed,其中我使用setText()方法将JLabel的文本设置为"Processing".ActionPerformed中的最后一个语句是使用setText()将JLabel的文本设置为"Processed".

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

fla*_*yte 9

因为它现在不能正常工作的原因是处理GUI刷新的Java线程也处理监听器的事件.因此,当您调用该setText()方法时,它会告诉GUI线程(称为EDT for Event Dispatch Thread)来更新Component,但是现在无法完成,因为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();
}
Run Code Online (Sandbox Code Playgroud)

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

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        myLabel.setText("my text");
    }
});
Run Code Online (Sandbox Code Playgroud)