0
statCl.addActionListener(new ActionListener(){
        public void actionPerformed (ActionEvent e) {
            try {
            ta.append("Searching...\n");
            //Do Some stuff, call some classes etc
                ta.append("Search Complete\n");
            } catch (Exception IOE) {}
        }
 });

これは奇妙な質問のように思えるかもしれませんが、私の GUI にはいくつか問題があります。基本的には、JMenu をクリックして目的の項目に移動し、それをクリックすると上記のコードが実行されるようにしたいのです。

ただし、ボタンをクリックすると、actionListener などの内部でプロセスを実行している間、一種のフリーズが発生します。その後、最終的に続行し、メニューを閉じて、ユーザーが続行できるようにします。問題は、プログラムがクラッシュしたように見えることです。

理想的には、ユーザーがクリックすると、「検索中...」というテキストが表示され、プロセスが実行され、プロセスが完了すると「検索完了」が出力されるようにしたいと思います

私は物事をtry/catchの内外に移動しようとしましたが、同じアイテムに別のactionListenerを追加しようとしましたが、うまくいきませんでした

どんなアイデアでも大歓迎です。

4

2 に答える 2

3

SwingWorkerを使用する必要があります。

ユーザーインターフェイスのすべての更新は、イベントディスパッチスレッド(EDT)で行う必要があります。アクションリスナー内のコードは、EDTでも呼び出されます。つまり、コードの実行中はUIが更新されません。

これを処理する通常の方法は、長時間実行されるコードをSwingWorker内で実行することです。次に、 SwingUtilities.invokeLaterを使用して、実行時間の長いコードがメソッドを呼び出してUIを更新できるようにします。これは、EDTで実行する必要があります。

于 2011-02-17T10:26:37.433 に答える
2

SwingWorkerを使用してみてください。

于 2011-02-17T10:26:40.380 に答える