JavaFX-2:如果窗口大小不是';不能手动设置吗?

JavaFX-2:如果窗口大小不是';不能手动设置吗?,java,javafx-2,Java,Javafx 2,我想在其父窗口的中心上方打开一个对话框窗口,因此我使用以下公式: 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

我想在其父窗口的中心上方打开一个对话框窗口,因此我使用以下公式:

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中,它不起作用,并导致不同的结果


如果不手动设置对话框的宽度和高度,如何获取对话框的宽度和高度?

舞台的宽度和高度是在显示后计算的(
.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()是没有意义的。

试试以下方法:

Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
System.out.println(screenBounds.getHeight());
System.out.println(screenBounds.getWidth());

它起作用了。但仅限于
show()
。对于
showAndWait()
,如果主窗口被移动,则会出现问题。如果我把它移到一边,对话框仍然会出现在屏幕中央。无论如何,感谢您提供这样的解决方案,我将继续寻找
showAndWait()
:)的解决方案这是屏幕的大小,对于所问的问题没有用处。然而,它可能在其他地方有用,并且是一条方便的信息。不幸的是,这是一个错误的地方。