4

我正在使用自定义 Canvas 类在 JavaFX 中创建应用程序。自定义 Canvas 类没有什么特别之处,它不包含任何代码。但是当我在它的 resize 函数中放置断点时,我注意到getWidth()在调整窗口大小时实际上并没有更新。

奇怪的是,如果我用不同的组件(例如按钮)替换我的 Canvas,那么我就没有问题。宽度已正确更新。

public class MyApp extends Application
{

  @Override
  public void start(Stage primaryStage) throws Exception
  {
    primaryStage.setTitle("Test");

    CustomCanvas canvas = new CustomCanvas();

    AnchorPane.setTopAnchor(canvas, 0d);
    AnchorPane.setLeftAnchor(canvas, 0d);
    AnchorPane.setBottomAnchor(canvas, 0d);
    AnchorPane.setRightAnchor(canvas, 0d);

    AnchorPane root = new AnchorPane();
    root.getChildren().add(canvas);
    root.setPrefWidth(500);
    root.setPrefHeight(500);

    primaryStage.setScene(new Scene(root,500,500));
    primaryStage.show();
  }

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

更多测试表明,基本上所有从Region类继承的组件都可以很好地调整大小。一个region.isResizable()方法返回true。另一方面,画布在false调用此方法时返回。

我当然可以通过绑定属性来使用解决方法。工作正常。

CustomCanvas canvas = new CustomCanvas();
canvas.widthProperty().bind(primaryStage.widthProperty());
canvas.heightProperty().bind(primaryStage.heightProperty());

但这让我更加好奇,为什么 AnchorPane 不能完成这项工作。是故意的还是 JavaFX 错误?

4

1 回答 1

1

覆盖 Canvas.isResizable() 以返回 true。

然后重写 Canvas.resize() 调用 Canvas.setWidth() 和 Canvas.setHeight()

于 2015-02-10T12:32:45.913 回答