2

私はJavaSwingを使用してコードを書いています。基本的には、長いタスクを処理します。タスクの実行中に、GIF画像を含む待機中のポップアップウィンドウが必要です。

私の質問はそれです

        final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName());

        final File finalFileToBeUploaded = fileToBeUploaded;

        class FileParsingWorker extends SwingWorker<Void, String> {            
            @Override
            protected Void doInBackground() throws Exception {
                String text = fileParsers.parseFile(finalFileToBeUploaded);
                publish(text);
                return null;
            }

            @Override
            protected void process(List<String> chunks) {
                infoDialog.setVisible(false);
            }
        }

        infoDialog.setVisible(true);
        FileParsingWorker fileParsingWorker = new FileParsingWorker();
        fileParsingWorker.execute();

InfoDialogは、GIFアニメーションが含まれる小さなUIポップアップウィンドウです。基本的に、私は長いタスクをワーカーに配置しましたが、UIのsetVisiblesは2か所に配置されています。スレッドでInfoDialogUIを実行して、そのコードを再利用できる方法があるかどうかを考えています。

私が抱えている問題は、意図的に停止するまで、InfoDialogを無期限に実行しようとすることです。setVisible(true)をスレッドに入れると、そのスレッドはすぐに終了し、UIは更新されません。

誰かがこれを行う方法を教えてもらえますか?

4

1 に答える 1

3

Concurrency in Swing、特にThe Event Dispatch Threadを読んでください。これは、すべての Swing コンポーネントを作成および操作するスレッドです。すなわち:

SwingUtilities.invokeLater(new Runnable () {
    @Override
    public void run() { 
        final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName());

        final File finalFileToBeUploaded = fileToBeUploaded;

        ...

        infoDialog.setVisible(true);
        FileParsingWorker fileParsingWorker = new FileParsingWorker();
        fileParsingWorker.execute();
    }
});

また、別の問題は、Swing ワーカーのdialogオーバーライドで背面を非表示に設定しているため、最初のチャンクが読み取られると閉じられることだと思います。Swing Workersメソッドは、あなたが望むものであり、EDT で実行される可能性があると思います。process(List<String> chunks)dialogdone()

class FileParsingWorker extends SwingWorker<Void, String> {            
    @Override
    protected Void doInBackground() throws Exception {
        String text = fileParsers.parseFile(finalFileToBeUploaded);
        publish(text);
        return null;
    }

    @Override
    protected void process(List<String> chunks) {
      //each chunk will get processed here
    }

    @Override
    protected void done() {//when Swing worker is finished this method is called
        infoDialog.setVisible(false);
    }
}
于 2013-02-26T08:22:14.797 に答える