5

もう少し説明すると、次のような GUI があります。

ここに画像の説明を入力

次に、次のように始まる [OK] ボタンにアクション リスナーがあります。

//OK Button Action Listener
private void okButtonActionPerformed(ActionEvent e) {   
    //Enable/Disable Buttons
    okButton.setEnabled(false);
    cancelButton.setEnabled(true);
    updateCheckbox.setEnabled(false);
    //Move on to a series of other methods here...

理論的には、これを実現する必要があります。

ここに画像の説明を入力

ただし、代わりに、[OK] ボタンに接続されているすべてのメソッドとその他のものが完了するまで、次のようになります。

ここに画像の説明を入力

プログラムの実行中は、キャンセル ボタンを使用可能にし、[OK] ボタンとその他のいくつかのチェックボックスを使用できないようにするためです (画像 2)。代わりに、半分の状態でフリーズします。 (画像 3)。これに対抗する方法はありますか?

4

4 に答える 4

7

GUI からロジックを実行するたびに、次の方法で SwingWorker を使用する必要があります。

SwingWorker myWorker= new SwingWorker<String, Void>() {
    @Override
    protected String doInBackground() throws Exception {
        //Execute your logic
        return null;
    }
};
myWorker.execute();

このロジック内から GUI を更新する場合は、InvokeLater を使用します。

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        //To update your GUI
    }
});

これにより、ロジックと GUI の両方の応答性を確実に保つことができます。

編集:

invokeAndWaitこれがニーズにより適している場合にも使用できます。関連する回答へのリンク

于 2013-07-31T16:01:42.660 に答える
3

うん、それはあなたが他の方法でEDTでブロックしたからです.

バックグラウンドで作業を行うには、別のものを使用する必要がありますThread。そうしないと、GUI がブロックされます。

Swing アプリケーションでは、実行時間の長いタスクはすべて で実行することをお勧めしますSwingWorker

概要については、ドキュメントを参照してください。

ASwingWorkerは与えられたタスクを実行し、完了したら GUI に報告できます。これはノンブロッキング方式で行われるため、タスクの実行中に GUI を引き続き使用できます。

バックグラウンド タスクをキャンセルできるようにするSwingWorker場合は、メソッドを呼び出せるようにへの参照を保持する必要がありますcancel。この場合、work メソッドは中断可能である必要があります。そうしないと、タスクをキャンセルできません。

于 2013-07-31T15:48:53.697 に答える