2013-02-18 16 views
11

私は、csvファイルからトランザクションデータの一括読み込みを実行するバックグラウンドサービスを設定しようとしています。このバックグラウンドサービスは、コントローラ/プレゼンタクラスのメソッドにマップされたメニュー項目のアクションから開始されます。JavaFX2:バックグラウンドのタスク/サービスを一時停止できますか?

データベースでマスターデータが見つからないcsvファイルでデータが表示されることがよくありますが、これは通常アップロードがチョークして失敗する原因になります。

このような場合、バックグラウンドサービスで処理を一時停止し、プレゼンタークラスからダイアログを呼び出してユーザー入力を受け入れることができるようにしたいと考えています。ユーザー入力は、データベースにマスター行を追加するために使用されます。その後、バックグラウンド・サービスは、中断していた場所から再開する必要があります(csvファイルの先頭からではなく、エラーの原因となった行から)。

おそらくjavafx.concurrent APIを使用して、これをJavaFXで実現できますか?これをどうやってやりますか?

答えて

20

ソリューション

あなたのバックグラウンド・プロセスは、JavaFXアプリケーションのスレッドでPlatform.runLatershowAndWaitに、ダイアログプロンプトで実行FutureTaskを使用し、入力を求めるプロンプトが表示されるように、ユーザが必要とする状況に遭遇したとき。バックグラウンドプロセスでは、ユーザーがプロセスを続行するのに必要な値を入力するまで、バックグラウンドプロセスを一時停止するにはfutureTask.getを使用します。


サンプルコードスニペットここ

あなたのバックグラウンド・プロセスの呼び出し方法の内側に配置することができ、このアプローチのためのコードの本質である:

String nextText = readLineFromSource(); 
if ("MISSING".equals(nextText)) { 
    updateMessage("Prompting for missing text"); 
    FutureTask<String> futureTask = new FutureTask(
    new MissingTextPrompt() 
); 
    Platform.runLater(futureTask); 
    nextText = futureTask.get(); 
} 
... 
class MissingTextPrompt implements Callable<String> { 
    private TextField textField; 

    @Override public String call() throws Exception { 
    final Stage dialog = new Stage(); 
    dialog.setScene(createDialogScene()); 
    dialog.showAndWait(); 
    return textField.getText(); 
    } 
    ... 
} 

サンプルアプリケーション

私はこのアプローチを示すためにa small, complete sample applicationを作成しました。

サンプルアプリケーションの出力は次のようになります。

行は単なる茶色である値を逃さずに読ん

promptingtaskdemooutput

サンプル出力説明。 プロンプト値を入力した行は、淡い緑色の背景を持ちます。 14行が読み込まれました。バックグラウンドタスクは、値を欠いていた6行目ですでに1回停止しています。ユーザは、(ユーザがxyzzyを入力した)欠損値の入力を求められた後、14行目も欠落し、バックグラウンド・タスクが再び一時停止され、別のプロンプト・ダイアログが表示されるまでプロセスが継続された。

+1

優秀、これは仕事をするように見えます。ありがとう。 –

+0

解決策を提供していただき、ありがとうございます。この変更は私の問題を解決するように見えます。しかし、あなたが提供したサンプルコードでは、最も興味深い動作が見られます。 入力文字列を変更し、最初のトークンを 'MISSING'に設定すると、プログラムがハングします。ユーザー入力を受け取るダイアログウィンドウがポップアップしません。しかし、(NetBeans 7.2で)デバッグを進めるとうまくいきます。ここで何が起こっているのか? –

+0

サンプルコードにバグがありました。コンテナがまだシーンに追加されていないときに(報告されていない) 'NullPointerException'を(正しく)投げていたタスクの中で、サンプルは' container.getScene()。getWindow() 'を使います。サンプルのロジックの順序を変更して、使用するコンテナがシーンに追加され(問題を回避するまで)、タスクが開始されないようにしました。 [更新サンプルコードリンク](https://gist.github.com/jewelsea/4989970)。 – jewelsea

関連する問題