-3

それで、私は SwingWorker のことを理解しました。

しかし、別の問題が発生しました(図を参照)...

Swing ワーカーは、エラー報告と電子メール送信を正確に管理し、電子メール送信は長時間 (0.5 秒以上) のタスクであるため、便利です...

エラーが処理される前にプログラムが実行を継続するのを防ぐために、EDT スレッドを一時停止する必要があります (その同期化されたもので)。ただし、それはまた、不確定な JProgressBar が持っていて、メッセージの送信中に使用されているクールな小さなアニメーションを一時停止します。つまり、EDT が一時停止するときです。

私の質問は、プログラムの実行を停止し、同時に JProgressBar でアニメーションを表示する方法はありますか?

これはやや疑似コードです:

メインクラスのエラーが発生 - スレッドを同期して一時停止し、SwingWorker を実行する別のクラスを実行 (作成) します (別のクラスが必要です。そうでなければ、これでそれほど問題はありませんでした)。

new ErrorDialog(Main.modal, lang.getString("errorConfigMissingTitle"), lang.getString("errorConfigMissingMessage"), e, false);

それはこれを呼び出します:

            //bunch of code, this below is an action listener of one of the buttons

            String s = "";

            (new ErrorSender(parent, error, s, dialog)).execute();

            synchronized (s)
            {
                try
                {
                    s.wait();
                }

                catch (InterruptedException e1)
                {
                    e1.printStackTrace();
                }
            }

            dialog.dispose();

            //create JDialog that tell user message was sent

SwingWorker クラスは、sendingErrorReport JDialog を作成し (JProgressBar を使用)、バックグラウンドでメッセージを送信します。メッセージが送信されると、一時停止が解除されます (notyfyAll())。

public class ErrorSender extends SwingWorker<Boolean, Void>
{
    Exception e;
    String s;

    public ErrorSender(JFrame parent, Exception error, String k, JDialog sendingDialog)
    {
        e = error;
        s = k;

        sendingDialog = new JDialog(parent, "Sending...", false);

        JProgressBar progress = new JProgressBar();
        progress.setString("Sending report...");
        progress.setStringPainted(true);
        progress.setIndeterminate(true);

        sendingDialog.getContentPane().add(progress);   
        sendingDialog.pack();
        sendingDialog.setLocationRelativeTo(null);
        sendingDialog.getContentPane().validate();
        sendingDialog.setResizable(false);
        sendingDialog.setVisible(true);
    }

    @Override
    protected Boolean doInBackground() throws Exception
    {

    //send email here

        synchronized (s)
        {
            s.notifyAll();
        }

        return null;
    }
}

一時停止が削除されない場合、done() に到達/呼び出されないため、done() メソッドから一時停止を削除していません...

4

2 に答える 2

4

バックグラウンド スレッドの実行中に EDT を一時停止してから再開することはまったく同じですが、EDT で時間のかかるブロック操作を行うため、より複雑な方法になります。意味がない。

バックグラウンド タスクの実行中にユーザーがプログラムを使用できないようにするには、単純にモーダル ダイアログを表示し、バックグラウンド タスクが完了したらそれを閉じます (または閉じられるようにします)。

于 2012-09-28T21:38:08.243 に答える
1

見て、テストしてください

  1. 予約例 SwingWorker と JProgressBar

  2. Executor と SwingWorker

  3. 例外を取得する方法

于 2012-09-28T21:40:36.127 に答える