【问题标题】:How to constrain JavaFX Stage size to a square (width = height)?如何将 JavaFX 舞台大小限制为正方形(宽度 = 高度)?
【发布时间】:2015-01-08 08:05:02
【问题描述】:

一开始我尝试实现似乎很容易的任务,但我无法成功。

我想强制主应用程序窗口是方形的。

以下 sn-p 在调整窗口高度时有效(它会闪烁,但宽度已正确更新),但当我更改舞台宽度时,它不会调整大小。

有人知道在 javafx 中限制舞台大小的更好方法吗?

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.stage.Stage;


public class SquareStage extends Application {

    public void start(Stage stage) throws Exception {
        stage.setTitle("Square Stage");
        stage.setWidth(300);
        stage.setHeight(300);

        ChangeListener<? super Number> listener = (ObservableValue<? extends Number> prop, Number oldVal, Number newVal) -> {
            if (prop == stage.widthProperty()) {
                stage.setHeight(newVal.doubleValue());
            }
            if (prop == stage.heightProperty()) {
                stage.setWidth(newVal.doubleValue());
            }
        };

        stage.widthProperty().addListener(listener);
        stage.heightProperty().addListener(listener);

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【问题讨论】:

    标签: javafx javafx-2 javafx-8


    【解决方案1】:

    改变值时使用removeListener和addListener,防止监听器串连。

    private ChangeListener<? super Number> widthChangeListener;
    private ChangeListener<? super Number> heightChangeListener;
    
    @Override
    public void start(Stage primaryStage) throws Exception {
    
        widthChangeListener = (observable, oldValue, newValue) -> {
            primaryStage.heightProperty().removeListener(heightChangeListener);
            primaryStage.setHeight(newValue.doubleValue());
            primaryStage.heightProperty().addListener(heightChangeListener);
        };
        heightChangeListener = (observable, oldValue, newValue) -> {
            primaryStage.widthProperty().removeListener(widthChangeListener);
            primaryStage.setWidth(newValue.doubleValue());
            primaryStage.widthProperty().addListener(widthChangeListener);
        };
    
        primaryStage.widthProperty().addListener(widthChangeListener);
        primaryStage.heightProperty().addListener(heightChangeListener);
    }
    

    【讨论】:

      【解决方案2】:

      这对我有用:

      stage.widthProperty().addListener((ObservableValue<? extends Number> ov, Number t, Number t1) -> {
          stage.setHeight(t1.doubleValue());
      });
      stage.heightProperty().addListener((ObservableValue<? extends Number> ov, Number t, Number t1) -> {
          stage.setWidth(t1.doubleValue());
      });
      

      【讨论】:

      • 不,这正是我已经在做的事情。并且与您stackoverflow.com/questions/27835898/… 报告的问题相同 问题仍然存在 - 如果我正在调整高度,那么它可以工作,如果我正在调整宽度,它不会(宽度重置为其原始值)
      • 我在识别奇怪行为之前回答了这个问题。抱歉,我没有删除答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多