4

長い機能を実行するボタンがあります。ユーザーが何度もクリックできないようにするために、ユーザーが一度クリックした後にこのボタンを無効にしたい

ボタンは無効になりますが、問題は機能が終了した後、ボタンが再び有効になることです。新しいスレッド
を入れようとしましbutton.setEnabled(false);たが、どちらも機能しませんでした

このコードサンプルをテストするため

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        button.setEnabled(false);
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            for (int j = 0; j < Integer.MAX_VALUE; j++) {
                for (int ii = 0; ii < Integer.MAX_VALUE; ii++) {
                }
            }
        }
    }
});
4

3 に答える 3

6

SwingWorker長時間実行されるバックグラウンド タスクに使用します。このでは、startButtonアクションが実行しsetEnabled(false)、ワーカーのdone()実装が実行しsetEnabled(true)ます。

于 2013-07-23T11:07:20.540 に答える
2
  • public void actionPerformed(ActionEvent ae) {すべてのコード行が実行されると、(画面上で)ラップされたすべてが一度に実行されます。これは、AWT/Swing リスナーと EventDispatchThread の基本ルールです。

  • を使用してEDTでイベントを遅らせる必要があります

    1. スイングタイマーによる短い遅延、
    2. 残りのコード ( の後button.setEnabled(false);) をSwingWorkerにリダイレクトします。最も簡単なのは です。既に表示されている Swing GUIRunnable#Threadからのすべての出力をRunnable#Threadにラップする必要があることに注意してください。invokeLater
  • 適切な方法は、設定のみSwing Actionをロックする代わりに andのみを使用しますJButtonAction.setEnabled(false)

于 2013-07-23T11:07:57.900 に答える