0

を拡張するクラスがありますSwingWorker<Void, Void>。バックグラウンドスレッドでは、レイアウトの変更とフレームへの新しいパネルの追加に成功した場合、ログインを行うことになっています。したがって、SwingWorkerは次の3つのタスクを実行します。

  1. ログイン
  2. レイアウトを変更する
  3. パネルを追加/削除します。

そこで、この関数をdoInBackground()メソッドで記述しました。ただし、ここで発生するのは、ログインが成功したかどうかに関係なく、この3つのメソッドが常に実行されることです。ログインに失敗したらworkerの実行を停止したい。cancel()メソッドを試しましたが、機能しませんでした。どうすればこれを適切な方法で行うことができますか?SwingWorkerでログインタスクを実行する適切な方法は何でしょうか?

4

2 に答える 2

2

2 番目と 3 番目の手順は、doInBackground()Swing コンポーネントを使用し、イベント ディスパッチ スレッドで実行する必要があるため、メソッドで実行してはなりません。done()ログインが成功した場合は、メソッドで実行する必要があります。

したがって、SwingWorker はむしろSwingWorker<Boolean, Void>. ログインが成功した場合、このdoInBackground()メソッドは true を返し、失敗した場合は false を返します。

SwingWorker<Boolean, Void> loginWorker = new SwingWorker<Boolean, Void>() {
    protected Boolean doInBackground() {
        return login();
    }

    protected void done() {
        try {
            boolean loginSuccessful = get();
            if (loginSuccessful) {
                updateGUI();
            }
        }
        catch (Exception e) {
            displayErrorMessage(e);
        }
    }
};
于 2012-07-31T08:37:34.777 に答える
0

ロビンが言ったように、リターンを使用してください。実際、ステップ 1 はバックグラウンド スレッドで実行し、ステップ 2 と 3 はイベント ディスパッチ スレッドで実行する必要があります。そう

protected Void doInBackground() {
    boolean success = login();
    this.setSuccess(success); // so that other thread knows whether you logged in
}

protected void done() {
    if (this.getSuccess()) {
//Change layout
//Add/remove panels.
    }
}
于 2012-07-31T08:36:55.037 に答える