あなたの問題はここにあります:
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(...)
このコードはデフォルトで EDT で既に実行されているため、ActionListener の for コードを使用する必要がないことに注意してください。
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;
}
}
そして必ず読んでください: Concurrency in Swing。