web-dev-qa-db-ja.com

ステージのサイズ変更をコンポーネントのサイズ変更にバインドする方法は?

FXMLを使用したJavaFX 2.0アプリケーションがあります。アプリケーションを含むウィンドウのサイズが変更されたときに、コンポーネント(TextFields、ComboBoxes、レイアウトなど)のサイズを変更する必要があります。そう...

  • JavaFXのOracleドキュメント に書かれているように、図形でこのようなものを作成するために、図形にいくつかの特別なプロパティがあります。

JavaFXを使用してGUIアプリケーションを構築する場合、APIの特定のクラスがすでにプロパティを実装していることに気付くでしょう。たとえば、_javafx.scene.shape.Rectangle_クラスには、arcHeightarcWidthheightwidthx、およびyのプロパティが含まれます。これらのプロパティごとに、前述の規則に一致する対応するメソッドがあります。たとえば、getArcHeight()setArcHeight(double)arcHeightProperty()は、指定されたプロパティが存在することを(開発者とツールの両方に)一緒に示します。*

  • ステージにリスナーを追加するには、次のようにする必要があります。

    _   stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    });
    _

したがって、2つの質問があります。

  • バインディングを作成するには、コントローラークラスでステージを取得する必要があります。だから-どのようにしてコントローラークラスのステージを取得できますか?
  • UIコントロールには、何かにバインドされるwidth\heightプロパティがないようです。または、おそらく私はそれらを見つけていません。

だから、どうすれば問題を解決できますか?

[〜#〜] upd [〜#〜]。 Scene BuilderからSergey Grinevへ:コンポーネントでCtrl + Kを使用する場合(親コンポーネントの領域全体を占めるように伝える)-すべて問題ありません。

しかし、コンポーネントにエリアの50%を占有するように伝えたい場合はどうすればよいですか?たとえば、2つのVBoxを含むタブがあります。タブの幅は100pxです。 Vboxの幅は、それぞれ50pxです。 VBox1にはx1 = 0、およびx2 = 50、VBox2にはx1 = 50、およびx2 = 100。次に、JavaFXアプリケーションでウィンドウのサイズを変更します。これで、タブの幅=200pxになりました。しかし、私のVBoxesの幅はまだ=50px:VBox1にはx1 = 0 、およびx2 = 50、VBox2にはx1 = 150、およびx2 = 200。そして、私はそれらをVBox1x1 = 0およびx2 = 100にする必要がありますおよびVBox2x1 = 100およびx2 = 200。ここで、x1とx2の値はVBoxesコーナーの座標です。

この状況でScene Builderはどのように役立ちますか?

16

もう1つの簡単なオプションは、JavaFX Scene Builderを使用することです(最近公開ベータ版として利用可能になります: http://www.Oracle.com/technetwork/Java/javafx/tools/index.html

ドラッグアンドドロップでUIを作成し、UI要素を境界線に( アンカーツール で)アンカーできるため、ウィンドウの境界線に合わせて移動/サイズ変更できます。

更新:

パーセントレイアウトの自動サイズ変更を実現するには、GridPaneColumnConstraintを使用できます。

public void start(Stage stage) {

    VBox box1 = new VBox(1);
    VBox box2 = new VBox(1);

    //random content
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20);
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build());
    builder.fill(Color.RED);
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build());

    //half by half screen
    GridPane grid = new GridPane();
    grid.addRow(0, box1, box2);

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build();
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint);

    stage.setScene(new Scene(grid, 300, 250));
    stage.show();
}
7
Sergey Grinev

サイズ変更可能なGUIを構築するためのいくつかの提案=>

  • アプリのルートがグループではなく、ペインのサブクラスであることを確認してください。
  • ボタンの最大サイズの固定を解除します(例:button.setMaxSize(Double.MAX_VALUE、Double.MAX_VALUE)。
  • ほとんどの場合、レイアウトペインはサイズ変更を処理でき、バインドとリスナーは不要です。つまり、本当に必要な場合にのみバインドします。
  • UIコントロールとレイアウトペインは、リージョン=>すべてのリージョンに、読み取りとバインドが可能な読み取り専用の高さと幅のプロパティがあります。
  • コントロールの高さと幅のプロパティを別の値に直接バインドすることはできません。代わりに、minWidth/Height、prefWidth/Height、maxWidth/Heightプロパティを使用します。
  • シーンには、必要に応じてバインドできる高さと幅のプロパティがあります。これを行うと、ステージのサイズが変更されると、シーンのサイズが変更され、バインドされたコンポーネントのサイズが変更されます。シーンのルートがグループではなくレイアウトペインである場合、このバインディングは通常不要です。
  • シーンに高さと幅を設定しない場合、スタンドアロンアプリの場合、シーン(およびステージ)は、シーンのルートノードの優先サイズ(通常は必要なサイズ)に合うようにサイズ変更されます。
  • 他のすべてが失敗した場合、Parentのlayoutchildrenメソッドのオーバーライドを開始できます。

上記の原則のいくつかを実装するサイズ変更可能なJavaFX UIです。

20
jewelsea

提案:

  1. メインステージが1つしかない場合は、アプリの起動中に静的フィールド/変数に格納し、すべてのコントローラークラスでアクセスします。
  2. すべてのコントロール/コンポーネントを、その子レイアウトを自動的に管理するレイアウト/ペインに配置できます。さまざまなレイアウトについては、APIドキュメントを確認してください。その後、それに応じてステージシーンのwidthプロパティとheightプロパティをこのレイアウトのプロパティにバインドします。バインディングの詳細については、 JavaFXプロパティとバインディングの使用 を参照してください。
    単方向バインディング の例
3
Uluk Biy