如何将JavaFX Stage大小限制为一个正方形(宽度=高度)? [英] How to constrain JavaFX Stage size to a square (width = height)?

查看:51
本文介绍了如何将JavaFX Stage大小限制为一个正方形(宽度=高度)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一开始尝试执行看似简单的任务,但我无法使其工作.

I tried to implement what seemed to be an easy task at first, but I can't make it work.

我想强制主应用程序窗口为正方形.

I would like to force the main application window to be square.

以下代码段在调整窗口高度(闪烁,但宽度已正确更新)时有效,但是当我更改舞台的宽度时,它不会重新调整大小.

The following snippet works when resizing the height of the window (it flickers, but the width is properly updated), but when I change the width of the stage it doesn't resize.

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

Does anyone know a better approach for constraining the stage size in 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);
    }
}

推荐答案

更改值时请使用removeListener和addListener,以防止侦听器链接.

Use removeListener and addListener when changing value ​​to prevent listeners from chaining.

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

这篇关于如何将JavaFX Stage大小限制为一个正方形(宽度=高度)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆