可能重复:
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的文本设置为“Processed”。
当我运行程序时,标签显示“单击按钮”。最后它变为“已处理”。但是,它从不显示“正在处理”。
答案 0 :(得分: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();
}
理想情况下,必须从EDT本身调用setText()
方法和其他改变组件的方法以避免错误......在我给你的例子中并非如此。如果你想这样做,请使用以下方法:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myLabel.setText("my text");
}
});
答案 1 :(得分:1)
在“处理”和“已处理”JLabel
文字的设置之间必须有延迟,否则文字的更改将太快无法观察。
一种方法是在2 setText
次来电之间使用Swing Timer。您的JButton
ActionListener
可能如下所示:
public void actionPerformed(ActionEvent e) {
label.setText("Processing...");
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("Processed");
}
};
Timer timer = new Timer(1000, taskPerformer); // delay one sec
timer.setRepeats(false);
timer.start();
}