为了账号安全,请及时绑定邮箱和手机立即绑定

防止对话框离开屏幕

防止对话框离开屏幕

眼眸繁星 2021-08-19 13:27:42
我有一个很好的primaryStage。我有一个以primaryStage为中心打开的对话框(我通过将对话框的所有者设为primaryStage来实现这个功能dialog.setInitOwner(primaryStage).  但是,如果 primaryStage 已经靠近屏幕边缘,则对话框将离开屏幕。如果所有者靠近屏幕边缘,如何使对话框(所有者为 primaryStage)不离开屏幕?我试过这个:    double x = dialog.getX();    double y = dialog.getY();    double w = dialog.getWidth();    double h = dialog.getHeight();    if (x < Main.bounds.getMinX())    {        dialog.setX(Main.bounds.getMinX());    }    if (x + w > Main.bounds.getMaxX())    {        dialog.setX(Main.bounds.getMaxX() - w);    }    if (y < Main.bounds.getMinY())    {        dialog.setY(Main.bounds.getMinY());    }    if (y + h > Main.bounds.getMaxY())    {        dialog.setY(Main.bounds.getMaxY() - h);    }    dialog.showAndWait();Main.bounds 由以下人员创建:private static Bounds computeAllScreenBounds(){    double minX = Double.POSITIVE_INFINITY;    double minY = Double.POSITIVE_INFINITY;    double maxX = Double.NEGATIVE_INFINITY;    double maxY = Double.NEGATIVE_INFINITY;    for (Screen screen : Screen.getScreens())    {        Rectangle2D screenBounds = screen.getVisualBounds();        if (screenBounds.getMinX() < minX)        {            minX = screenBounds.getMinX();        }        if (screenBounds.getMinY() < minY)        {            minY = screenBounds.getMinY();        }        if (screenBounds.getMaxX() > maxX)        {            maxX = screenBounds.getMaxX();        }        if (screenBounds.getMaxY() > maxY)        {            maxY = screenBounds.getMaxY();        }    }    return new BoundingBox(minX, minY, maxX - minX, maxY - minY);尝试这个,不会改变任何行为。我觉得这是因为 dialog.getX() 函数返回一个 NaN ... }
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

使用 showAndWait 时警报上的 onShown 处理程序的(对我来说出乎意料的)问题是,在调用处理程序时,警报尚未显示且尚未确定大小/位置 - 这有点疯狂,可能被视为错误.


一种解决方法是侦听警报的显示属性并在该侦听器中进行任何大小/位置调整。类似的东西(显然只是一个 poc)


alert.showingProperty().addListener((src, ov, nv) -> {

    double x = alert.getX();

    double y = alert.getY();

    double w = alert.getWidth();

    double h = alert.getHeight();


    // as example just adjust if location top/left is off 

    // production must cope with bottom/right off as well, obviously 

    if (x < 0) {

        alert.setWidth(w + x);

        alert.setY(0);

    }

    if (y <0) {

        alert.setHeight(h + y);

        alert.setY(0);

    }


});

alert.showAndWait();

仅供参考:我真的认为这是一个错误,所以提交了一个问题让我们看看会发生什么


查看完整回答
反对 回复 2021-08-19
?
撒科打诨

TA贡献1934条经验 获得超2个赞

当您将对话框定位在舞台中央时.. 如果舞台也(至少部分)在您的屏幕之外,则该对话框只能在屏幕之外。


请看下面的代码示例..


@Override

public void start(Stage stage) {


    Pane pane = new Pane();

    Scene scene = new Scene(pane, 800, 500);


    Button button = new Button("Alert");

    button.setOnAction(new EventHandler<ActionEvent>() {

        @Override

        public void handle(ActionEvent event) {

            Alert alert = new Alert(Alert.AlertType.INFORMATION);

            alert.setHeaderText("This is an alert!");

            alert.initOwner(stage);


            alert.setOnShown(new EventHandler<DialogEvent>() {

                @Override

                public void handle(DialogEvent event) {

                    System.out.println(alert.getOwner().getX());

                    System.out.println(alert.getOwner().getY());


                    //Values from screen

                    int screenMaxX = (int) Screen.getPrimary().getVisualBounds().getMaxX();

                    int screenMaxY = (int) Screen.getPrimary().getVisualBounds().getMaxY();


                    //Values from stage

                    int width = (int) stage.getWidth();

                    int height = (int) stage.getHeight();

                    int stageMaxX = (int) stage.getX();

                    int stageMaxY = (int) stage.getY();


                    //Maximal values your stage

                    int paneMaxX = screenMaxX - width;

                    int paneMaxY = screenMaxY - height;


                    //Check if the position of your stage is not out of screen 

                    if (stageMaxX > paneMaxX || stageMaxY > paneMaxY) {

                        //Set stage where ever you want

                    }

                }

            });


            alert.showAndWait();


        }

    });


    pane.getChildren().add(button);

    stage.setScene(scene);

    stage.show();

}



查看完整回答
反对 回复 2021-08-19
  • 2 回答
  • 0 关注
  • 226 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信