何かが起こっているという視覚的なフィードバックをユーザーに提供したい場合(そしておそらく進行状況についてのヒントを与えたい場合)、次に進んでJProgressBar
くださいSwingWorker
(詳細)。
一方、状況が必要な場合、ユーザーがボタンをクリックし、タスクがバックグラウンドで実行されることになっている場合(ユーザーが他のことをしている間)、次のアプローチを使用します。
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button.setEnabled(false); // change text if you want
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
// Do the calculations
// Wait if you want
Thread.sleep(1000);
// Dont touch the UI
return null;
}
@Override
protected void done() {
try {
get();
} catch (Exception ignore) {
} finally {
button.setEnabled(true); // restore the text if needed
}
}
}.execute();
}
});
最後に、Swing
特定のタイマーを使用していた最初のソリューション:
final JButton button = new JButton("Save");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Take somehow care of multiple clicks
button.setText("Saving...");
final Timer t = new Timer(10000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
button.setText("Saved");
}
});
t.setRepeats(false);
t.start();
}
});