【问题标题】:JavaFX: Get bounds of Stage before maximizingJavaFX:在最大化之前获取舞台的边界
【发布时间】:2017-11-15 22:54:59
【问题描述】:

我想在Stage 被用户最大化之前获取/记住它的边界。我注意到我可以将事件处理程序添加到舞台的最大化属性,但这对我没有帮助。舞台此时已经最大化,getX()getWidth() 已经报告了舞台最大化后的位置或大小。

myStage.maximizedProperty().addListener((observable, oldValue, newValue) -> {
    double x = myStage.getX(); // already too late, x has changed
    ...

我怎样才能得到舞台的边界之前它已经改变了大小?使用当前的 API 是否也能做到这一点?

PS:更大的目标是记住舞台位置、状态和屏幕。如果用户定位舞台、最大化它、退出应用程序并再次重新启动它,那么我希望舞台的定位就像用户退出应用程序之前一样。这意味着我需要首先将新阶段定位在先前未最大化的位置,然后将其最大化,以恢复先前的状态。但是在最大化这个接缝之前不知道尺寸是不可能的。

【问题讨论】:

    标签: java javafx event-handling javafx-8


    【解决方案1】:

    当我们按下按钮最大化 JavaFX 窗口时,首先将舞台最大化,然后更新其宽度和高度属性。因此,只有在未最大化时才应记住舞台的尺寸。

    例如,在我们的项目中,我们将舞台尺寸保存在配置文件中,也遇到了类似的问题。解决方法如下:

    stage.widthProperty().addListener((obs, oldVal, newVal) -> {
        if (!stage.isMaximized()) {
            config.setWidth(newVal.intValue());
        }
    });
    
    stage.heightProperty().addListener((obs, oldVal, newVal) -> {
        if (!stage.isMaximized()) {
            config.setHeight(newVal.intValue());
        }
    });
    
    stage.maximizedProperty().addListener((obs, oldVal, newVal) -> {
        config.setMaximized(newVal));
    });
    

    【讨论】:

      【解决方案2】:

      我也遇到过同样的问题。问题是 X 和 Y 属性是在最大化标志之前设置的,所以在最大化时,XY 将用于最大化窗口。

      对我来说,解决方案是保存 X 和 Y 的旧值并在窗口最大化时恢复它们。

      private Integer stageWidth;
      private Integer stageHeight;
      private Integer stageX;
      private Integer stageY;
      private boolean isMaximized = false;
      
      //this values will hold the x and y before maximized
      private Integer oldStageX;
      private Integer oldStageY;
      
      public void setupStageListeners(Stage stage) {
          stage.heightProperty().addListener((obs, oldVal, newVal) -> {
              if (!isMaximized) {
                  stageHeight = newVal.intValue();
              }
          });
      
          stage.widthProperty().addListener((obs, oldVal, newVal) -> {
              if (!isMaximized) {
                  stageWidth = newVal.intValue();
              }
          });
      
          stage.xProperty().addListener((obs, oldVal, newVal) -> {
              if (!stage.isMaximized()) {
                  stageX = newVal.intValue();
                  //save old value in case of maximizing
                  oldStageX = oldVal.intValue();
              }
          });
      
          stage.yProperty().addListener((obs, oldVal, newVal) -> {
              if (!isMaximized) {
                  stageY = newVal.intValue();
                  oldStageY = oldVal.intValue();
              }
          });
      
          stage.maximizedProperty().addListener((obs, oldVal, newVal) -> {
              isMaximized = newVal;
      
              //if maximized save the X and Y old values
              if(isMaximized) {
                  stageX = oldStageX;
                  stageY = oldStageY;
              }
          });
      }
      
      
      public void saveWindowState() {
          properties.setProperty(STAGE_WIDTH, String.valueOf(stageWidth));
          properties.setProperty(STAGE_HEIGHT, String.valueOf(stageHeight));
          properties.setProperty(STAGE_X, String.valueOf(stageX));
          properties.setProperty(STAGE_Y, String.valueOf(stageY));
          properties.setProperty(IS_MAXIMIZED, String.valueOf(isMaximized));
      
          savePropertiesFile();
      }
      

      【讨论】:

        【解决方案3】:

        嗯,阿拉斯泰尔没有错。

        javaFX Stage 有一个widthProperty 和一个heightProperty(继承自Window,带有getter 和Setter。 您可以将ChangeListener 注册到这两个属性并在侦听器捕获事件时保护它们的状态。

        ChangeListener Doc

        height- and widthproperty docs in Window.

        【讨论】:

        • 没有帮助。 x 和 y 属性在最大化事件之前更改,而宽度和高度属性在之后更改。回到正常状态的路上也一样。我总是得到边界的半完整状态,但在最大化之前或之后从未得到完整状态。
        猜你喜欢
        • 2015-05-21
        • 2012-01-10
        • 1970-01-01
        • 2016-12-13
        • 2013-01-14
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多