家长舞台的中心舞台

2022-09-02 13:14:49

我正在JavaFx中创建一个应用程序,我想这样做,如果任何子阶段被打开,那么它应该在父阶段的中心打开。我正在尝试使用执行此操作,但它会将子舞台分配到屏幕中心,而不是父舞台的中心。如何将子舞台分配到父舞台的中心?mystage.centerOnScreen()

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

答案 1

可以使用父阶段的 X/Y/宽度/高度属性来执行此操作。您可以执行以下操作,而不是使用 ,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);
    }
}

答案 2

当您没有确定子舞台的大小时,您必须监听宽度和高度的变化,因为当调用 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();

推荐