8

親ウィンドウの中央の上にダイアログ ウィンドウを開きたいので、次の式を使用します。

Window window = ((Node) actionEvent.getSource()).getScene().getWindow();
Scene scene = new Scene(new Group(new DialogWindow()));
Stage dialog = new Stage();
dialog.initOwner(window);
dialog.sizeToScene();

dialog.setX(stage.getX() + stage.getWidth() / 2 - dialog.getWidth() / 2); //dialog.getWidth() = NaN
dialog.setY(stage.getY() + stage.getHeight() / 2 - dialog.getHeight() / 2); //dialog.getHeight() = NaN

dialog.setScene(scene);
dialog.show(); //it is better to showAndWait();

ウィンドウをコンテンツのサイズに合わせて自動的にサイズ変更する必要があるため、手動でサイズを設定しません。

Linux では、ウィンドウを親ウィンドウの中央にまっすぐに設定します。しかし、Windows では機能せず、異なる結果につながります。

手動で設定しない場合、ダイアログの幅と高さを取得するにはどうすればよいですか?

4

2 に答える 2

17

の幅と高さは、Stage表示後に計算されます ( .show())。その後、計算を行います。

...
dialog.show();
dialog.setX(stage.getX() + stage.getWidth() / 2 - dialog.getWidth() / 2); //dialog.getWidth() = not NaN
dialog.setY(stage.getY() + stage.getHeight() / 2 - dialog.getHeight() / 2); //dialog.getHeight() = not NaN

編集:の代わりに を使用すると
、呼び出し元イベントがブロックされるため、 の後の計算もブロックされます。回避策の 1 つの方法は、 new で前に計算を行うことです。showAndWait()show()showAndWait()showAndWait()Runnable

final Stage dialog = new Stage();
dialog.initOwner(window);
dialog.initModality(Modality.WINDOW_MODAL);
dialog.sizeToScene();
dialog.setScene(scene);

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        dialog.setX(primaryStage.getX() + primaryStage.getWidth() / 2 - dialog.getWidth() / 2); //dialog.getWidth() = NaN
        dialog.setY(primaryStage.getY() + primaryStage.getHeight() / 2 - dialog.getHeight() / 2); //dialog.getHeight() = NaN
    }
});
dialog.showAndWait();

にも注意してくださいinitModality。の場合、モダリティを設定する必要がありますshowAndWait()。そうでなければ、使用しshowAndWait()ても意味がありません。

于 2013-09-28T11:30:09.543 に答える