2

これがファイルチューザーダイアログ操作の私のコードです...

FileChooser fc = new FileChooser();
fc.setTitle("Pointel File");
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage());

int i =0;
while(i < 90000){
System.out.println(i);
i++;
}

上記のコードでは、ダイアログは「開く」ボタンをクリックした瞬間に閉じるのではなく、「while」ループの実行が完了するまで待機しています。

[開く]または[キャンセル]ボタンをクリックした瞬間にダイアログを閉じるコードに何かが欠けていますか?
誰か助けてくれませんか?

4

2 に答える 2

2

UI のアプリケーション スレッドで長時間実行していますが、これは実行すべきではありません。そうしないと、UI が応答しなくなります。

むしろ、アプリケーション スレッドで実行時間の長いプロセスを作成Taskまたは実行します。Thread

JavaFX での同時実行の詳細については、このリンクを参照してください。

の短い例を次に示しTaskます。

import javafx.concurrent.Task;

....

FileChooser fc = new FileChooser();
fc.setTitle("Pointel File");
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage());

    final Task task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            int i = 0;
            while (i < 90000) {
                System.out.println(i);
                i++;
            }
            return null;
        }
    };
    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();

また、JavaFX UI コンポーネントを変更する場合は、次のPlatform.runLater(Runnable r)ようにコードをブロックでラップすることも忘れないでください。

import javafx.concurrent.Task;

....

final Task task = new Task<Void>() {
    @Override
    protected Void call() throws Exception {
        int i = 0;
        while (i < 90000) {
            System.out.println(i);
            i++;
        }
    Platform.runLater(new Runnable() {//updates ui on application thread
            @Override
            public void run() {
                //put any updates to ui here dont run the long running code in this block or the same will happen as doing a long running task on app thread
            }
        });
        return null;
    }
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
于 2012-12-12T11:04:54.547 に答える
0

GUI と計算タスクを同じスレッドで実行しないでください。UI は 1 つのスレッドで実行し、計算タスクは別のスレッドで実行する必要があります。両方が同じスレッドで実行されている場合、UI が応答しなくなります。

最初に読んだのは、

スレッド

イベントディスパッチスレッド

スイングワーカー

を使用してEvent Dispatch Thread、UI スレッドをディスパッチできます。に関連する @Erick Robertsonの回答を見てくださいEDT

上記のトピックに関するSOで利用可能な多くの投稿。

于 2012-12-13T03:25:24.467 に答える