4

カスタム Canvas クラスを使用して JavaFX でアプリケーションを作成しています。カスタム Canvas クラスは特別なものではなく、コードは含まれていません。しかし、サイズ変更機能にブレークポイントを設定すると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 に答える