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");
}
});