Расположение центра сцены
Я создаю приложение в 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/width/height родительской стадии. Вместо использования 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
Если вы не определяете размер для childStage, вам необходимо прослушивать изменения ширины и высоты, так как ширина и высота остаются NaN при вызове 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();