Center stage on parent stage

18,435

Solution 1

You can use the parent stage's X/Y/width/height properties to do that. Rather than using Stage#centerOnScreen, you could do the following:

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);
    }
}

Solution 2

When you don't determine a size for the childStage, you have to listen for width and height changes as width and height is still NaN when onShown is called.

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();
Share:
18,435
Ronak
Author by

Ronak

I am one of the Senior Software Engineer (automation) at InfoStretch Solutions Pvt. Ltd. Website : http://www.infostretch.com/

Updated on June 17, 2022

Comments

  • Ronak
    Ronak almost 2 years

    I am creating an application in JavaFx, In which I want to do that if any child stage is getting opened then it should be opened in center of parent stage. I am trying to do this using mystage.centerOnScreen() but it'll assign the child stage to center of screen, not the center of parent stage. How can I assign the child stage to center of parent stage?

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