カスタム 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のバグですか?