首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在保持高宽比的同时使javafx.scene.Scene调整大小?

如何在保持高宽比的同时使javafx.scene.Scene调整大小?
EN

Stack Overflow用户
提问于 2013-05-13 23:49:57
回答 3查看 24.2K关注 0票数 7

我正在用JavaFX 2.2.7-b01编写一个应用程序。

下面是我目前拥有的代码的一个示例。如何允许调整应用程序窗口的大小,但保持最初配置的纵横比?换句话说,如果用户调整窗口大小,则窗口宽度应始终保持为窗口高度的两倍。

代码语言:javascript
复制
  ...
  public void showScene(Stage stage, String fxmlPath) {
    try {
      FXMLLoader loader = new FXMLLoader();
      loader.setBuilderFactory(new JavaFXBuilderFactory());
      loader.setLocation(fxmlPath);
      Parent page;
      try (InputStream in = Main.class.getResourceAsStream(fxmlPath)) {
        page = (Parent) loader.load(in);
      }
      Scene scene = new Scene(page, 400, 200);
      stage.setScene(scene);
      stage.sizeToScene();
      stage.show();
    } catch (Exception ex) {
      ...
    }
  }
  ...

JavaFX似乎允许用户在构造函数中指定场景的宽度和高度,但不允许编程访问来更新宽度或高度。没有setWidth或setHeight方法。我知道我可以添加属性侦听器,以便在调整大小时获得场景的只读宽度/高度,但我还无法弄清楚如何动态地更改场景尺寸,以便能够强制保持高宽比。

我想,如果我要子类场景对象(如果必须的话,我会这样做),这是可能的,但是还有其他简单的方法来做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-05 14:04:31

> How to make javafx.scene.Scene resize while maintaining an aspect ratio?

通过操纵舞台大小而不是场景:

代码语言:javascript
复制
@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Play by resizing the window");
    VBox root = new VBox();
    root.getChildren().add(btn);
    root.setStyle("-fx-background-color: gray");

    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.minWidthProperty().bind(scene.heightProperty().multiply(2));
    primaryStage.minHeightProperty().bind(scene.widthProperty().divide(2));
    primaryStage.show();
}
票数 6
EN

Stack Overflow用户

发布于 2021-03-21 13:44:55

在更改值removeListener时使用addListener和​​,以防止侦听器链接。

代码语言:javascript
复制
private ChangeListener<? super Number> widthChangeListener;
private ChangeListener<? super Number> heightChangeListener;

@Override
public void start(Stage stage) throws Exception {

    widthChangeListener = (observable, oldValue, newValue) -> {
        stage.heightProperty().removeListener(heightChangeListener);
        stage.setHeight(newValue.doubleValue() / 2.0);
        stage.heightProperty().addListener(heightChangeListener);
    };
    heightChangeListener = (observable, oldValue, newValue) -> {
        stage.widthProperty().removeListener(widthChangeListener);
        stage.setWidth(newValue.doubleValue() * 2.0);
        stage.widthProperty().addListener(widthChangeListener);
    };

    stage.widthProperty().addListener(widthChangeListener);
    stage.heightProperty().addListener(heightChangeListener);
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-05 11:52:02

在netbeans中,使用Java场景生成器可以使用AnchorPane约束设置舞台的调整大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16532962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档