你的问题在这里:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
theButton.setText("Trying to connect...");
theButton.setEnabled(false);
theButton.repaint();
// doing some IO operation which takes few seconds // **********
theButton.setText("connected ( click to disconnect)");
theButton.setEnabled(true);
theButton.repaint();
}
});
- 标有
*******
注释的代码正在 EDT 上运行,并将冻结您的应用程序及其所有正在绘制的内容。
- 改用 SwingWorker 在后台线程中运行代码。
- 请注意,不需要使用
invokeLater(...)
ActionListener 中的代码,因为默认情况下此代码已在 EDT 上运行。
- 也摆脱你的
repaint()
电话,因为他们不需要,他们没有帮助。
- 将 PropertyChangeListener 添加到您的 SwingWorker 以侦听何时完成,然后您可以重置您的 JButton。
而是这样做:
// code not compiled nor tested
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
theButton.setText("Trying to connect...");
theButton.setEnabled(false);
MySwingWorker mySwingWorker = new MySwingWorker();
mySwingWorker.addPropertyChangeListener(new PropertyChangeListener() {
// listen for when SwingWorker's state is done
// and reset your button.
public void propertyChange(PropertyChangeEvent pcEvt) {
if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
theButton.setText("connected ( click to disconnect)");
theButton.setEnabled(true);
}
}
});
mySwingWorker.execute();
}
});
和
// code not compiled nor tested
public class MySwingWorker extends SwingWorker<Void, Void> {
@Override
public void doInBackground() throws Exception {
// doing some IO operation which takes few seconds
return null;
}
}
请务必阅读:Swing 中的并发。