【问题标题】:Center stage on parent stage父级舞台上的中心舞台
【发布时间】:2012-11-22 00:53:02
【问题描述】:

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

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

【问题讨论】:

    标签: java javafx-2 javafx stage


    【解决方案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);
        }
    }
    

    【讨论】:

    • 如果您没有明确设置 childStage 的宽度和高度,那么您可以在 childStage.setOnShown 事件的事件处理程序中执行计算。
    • 对于这看起来多么奇怪,当我这样做时,子阶段在构造时会得到它的大小...... childStage.toBack(); childStage.show(); childStage.hide(); childStage.toFront();
    【解决方案2】:

    当您没有确定 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();
    

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多