0

何をすべきかよくわからないというちょっとした問題に遭遇しました。

私のアプリケーションには、ユーザーに作業のオプション (タスク リストなど) を提示する一般的なアプリケーション ステージがあります。

ユーザーがこれらのオプションのいずれかを選択すると、ウィンドウに移動して作業を実行します。彼らは、一般的なステージを常に開いておいて、作業を行うための別のステージを開きたいと考えています。私はそれを行うことができます:

FXMLLoader loader = new FXMLLoader();
Parent node = loader.load(this.getClass().getResource("MyView.fxml").openStream());
Scene scene = new Scene(node);
Stage stage = new Stage();
stage.setTitle("You are working on - Blah Blah Blah....");
stage.setScene(scene);
stage.show();

これにより、目的のルック アンド フィールが提供されますが、モーダル ウィンドウが表示されたときにスレッド化の問題が発生しているようです。

たとえば、あるワーカー ウィンドウでサービスを開始し、次のように ControlsFX 進行状況ダイアログを表示します。

ProgressDialog progDiag = new ProgressDialog(service);
progDiag.setTitle("Busy");
progDiag.setHeaderText("Doing the work you asked me to do....");
service.start();

大量のデータを取得するサーバー呼び出しであると仮定しましょう。そのため、これが処理されている間、別のオープン ステージに移動して作業を行いたいと考えています。ただし、アプリケーション全体の UI がこのコントロールによってブロックされているため、できません。

次に、ステージの 1 つでエラーが発生し、アラートを表示するとします。

Alert error = new Alert(AlertType.ERROR);
error.setContentText("Something bad just happened....");
error.show();

これにより、問題のあるステージだけでなく、UI 全体もブロックされます。

Java FX で、他のステージのアラートによってブロックされない新しいプロセス/スレッドでステージを開く方法はありますか?

4

1 に答える 1

2

メッセージを表示するコントローラーへのステージの参照を提供することで、問題を解決できました。その参照を渡す必要があるので、私はこれに夢中ではありませんが、それを処理する別の方法が見つかりませんでした..

ProgressDialog progDiag = new ProgressDialog(service);
progDiag.setTitle(title);
progDiag.initOwner(getPrimaryStage());
progDiag.setHeaderText(message);
progDiag.initModality(Modality.WINDOW_MODAL);
service.start();
于 2015-01-12T15:20:51.263 に答える