如何将JavaFX舞台大小约束为正方形(宽度=高度)?

时间:2015-01-08 08:05:03

标签: javafx javafx-2 javafx-8

我一开始尝试实施一项似乎很容易的任务,但我无法让它发挥作用。

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

以下代码片段在调整窗口高度时会起作用(它会闪烁,但宽度会正确更新),但是当我更改舞台的宽度时,它不会调整大小。

有没有人知道在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);
    }
}

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

这对我有用:

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());
});