java - scenes - Centro de la etapa en la etapa de los padres
scene javafx (2)
Estoy creando una aplicación en JavaFx, en la que quiero hacer eso si se abre alguna etapa secundaria, entonces debería abrirse en el centro de la etapa principal. Estoy tratando de hacer esto usando mystage.centerOnScreen()
pero asignará la etapa secundaria al centro de la pantalla, no al centro de la etapa principal. ¿Cómo puedo asignar la etapa secundaria al centro de la etapa principal?
private void show(Stage parentStage) {
mystage.initOwner(parentStage);
mystage.initModality(Modality.WINDOW_MODAL);
mystage.centerOnScreen();
mystage.initStyle(StageStyle.UTILITY);
mystage.show();
}
Cuando no determina un tamaño para childStage, debe escuchar los cambios de ancho y alto, ya que el ancho y el alto siguen siendo NaN cuando se llama onShown.
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();
Puede usar las propiedades X / Y / ancho / alto de la etapa principal para hacer eso. En lugar de usar Stage#centerOnScreen
, puede hacer lo siguiente:
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);
}
}