父母舞台上的中心舞台

我正在JavaFx中创建一个应用程序,如果有任何子阶段被打开,我想要这样做,然后它应该在父阶段的中心打开。 我试图使用mystage.centerOnScreen()来做这mystage.centerOnScreen()但它会将子阶段分配到屏幕的中心,而不是父阶段的中心。 如何将子阶段分配到父阶段的中心?

 private void show(Stage parentStage) { mystage.initOwner(parentStage); mystage.initModality(Modality.WINDOW_MODAL); mystage.centerOnScreen(); mystage.initStyle(StageStyle.UTILITY); mystage.show(); } 

您可以使用父级的X / Y /宽度/高度属性来执行此操作。 您可以执行以下Stage#centerOnScreen ,而不是使用Stage#centerOnScreen

 public class CenterStage extends Application { @Override public void start(final Stage stage) throws Exception { stage.setX(300); stage.setWidth(800); stage.setHeight(400); stage.show(); final Stage childStage = new Stage(); childStage.setWidth(200); childStage.setHeight(200); childStage.setX(stage.getX() + stage.getWidth() / 2 - childStage.getWidth() / 2); childStage.setY(stage.getY() + stage.getHeight() / 2 - childStage.getHeight() / 2); childStage.show(); } public static void main(String[] args) { Application.launch(args); } } 

如果未确定childStage的大小,则必须侦听宽度和高度更改,因为调用onShown时宽度和高度仍为NaN。

 final double midX = (parentStage.getX() + parentStage.getWidth()) / 2; final double midY = (parentStage.getY() + parentStage.getHeight()) / 2; xResized = false; yResized = false; newStage.widthProperty().addListener((observable, oldValue, newValue) -> { if (!xResized && newValue.intValue() > 1) { newStage.setX(midX - newValue.intValue() / 2); xResized = true; } }); newStage.heightProperty().addListener((observable, oldValue, newValue) -> { if (!yResized && newValue.intValue() > 1) { newStage.setY(midY - newValue.intValue() / 2); yResized = true; } }); newStage.show();