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

编辑:
如果showAndWait()使用而不是show(),那么由于showAndWait()阻止调用者事件,之后的计算showAndWait()也被阻止。一种解决方法可能是在 new 之前进行计算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 回答
-1

试试这个:

Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
System.out.println(screenBounds.getHeight());
System.out.println(screenBounds.getWidth());
于 2014-02-17T11:17:16.193 回答