我一开始尝试实施一项似乎很容易的任务,但我无法让它发挥作用。
我想强制主应用程序窗口是正方形。
以下代码片段在调整窗口高度时会起作用(它会闪烁,但宽度会正确更新),但是当我更改舞台的宽度时,它不会调整大小。
有没有人知道在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);
}
}
答案 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());
});