web-dev-qa-db-ja.com

JavaFX 2.1でモーダルウィンドウを作成する方法

JavaFXでモーダルウィンドウを作成する方法がわかりません。基本的にファイルセレクターがあり、ユーザーがファイルを選択したときに質問をしたいと思います。ファイルを解析するためにこの情報が必要なので、実行は答えを待つ必要があります。

この質問 を見ましたが、この動作を実装する方法を見つけることができませんでした。

35
Luka

ここにソリューションへのリンク があります JavaFX 2.1のモーダルダイアログ用に以前に作成したソリューションは、現在のステージの上にモーダルステージを作成し、ダイアログコントロール。

更新

以前のリンクされたソリューションは、ダイアログが閉じられた後にアクションを実行するために、日付付きイベントハンドラーアプローチを使用します。このアプローチは、JavaFX 2.2より前の実装で有効でした。 JavaFX 8以降では、イベントハンドラーは不要です。代わりに、新しいステージ showAndWait() メソッドを使用してください。例えば:

Stage dialog = new Stage();

// populate dialog with controls.
...

dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait();

// process result of dialog operation. 
... 

物事が期待どおりに機能するためには、ステージの所有者およびを初期化して、ステージのモダリティを次のいずれかに初期化することが重要です。 WINDOW_MODAL または APPLICATION_MODAL

JavaFX 8 および ControlsFX に適合する場合、いくつかの高品質の標準UIダイアログがあります。独自のJavaFX Dialog および Alert クラスには initOwner および initModality および showAndWait メソッド。これにより、必要に応じてモダリティを設定できます(デフォルトでは、組み込みダイアログはアプリケーションモーダルです)。

42
jewelsea

私の意見では、親ウィンドウは常にアクティブであるため、これは良い解決策ではありません。
たとえば、ボタンをクリックした後にウィンドウをモーダルとして開く場合...

private void clickShow(ActionEvent event) {
    Stage stage = new Stage();
    Parent root = FXMLLoader.load(
        YourClassController.class.getResource("YourClass.fxml"));
    stage.setScene(new Scene(root));
    stage.setTitle("My modal window");
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner(
        ((Node)event.getSource()).getScene().getWindow() );
    stage.show();
}

これで、新しいウィンドウは本当にモーダルです-親はブロックです。また使用できます

Modality.APPLICATION_MODAL
68