18

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

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

JavaFXを使用してGUIアプリケーションを構築する場合、APIの特定のクラスがすでにプロパティを実装していることに気付くでしょう。たとえば、クラスjavafx.scene.shape.Rectangleには、、、、、、、およびのプロパティが含まれています。これらのプロパティのそれぞれについて、前述の規則に一致する対応するメソッドがあります。たとえば、、、、は、指定されたプロパティが存在することを(開発者とツールの両方に)一緒に示します。*arcHeightarcWidthheightwidthxygetArcHeight()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。SceneBuilderからSergeyGrinevについて:コンポーネントでCtrl + Kを使用すると(親コンポーネントの全領域を占めるように指示します)、すべて問題ありません。

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

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

4

3 に答える 3

20

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

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

上記の原則のいくつかを実装するサイズ変更可能なJavaFXUIの例を次に示します。

于 2012-04-25T19:34:35.613 に答える
7

もう1つの簡単なオプションは、JavaFX Scene Builderを使用することです(最近、パブリックベータとして利用可能になります:http ://www.oracle.com/technetwork/java/javafx/tools/index.html )

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

アップデート:

自動サイズ変更のパーセンテージレイアウトを実現するには、次のコマンドを使用できGridPaneますColumnConstraint

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();
}
于 2012-04-26T08:33:04.007 に答える
3

提案:

  1. メインステージが1つしかない場合は、アプリの起動時に静的フィールド/変数に保存し、すべてのコントローラークラスでアクセスします。
  2. すべてのコントロール/コンポーネントを、子のレイアウトを自動的に管理するレイアウト/ペインに配置できます。さまざまなレイアウトについては、APIドキュメントを確認してください。その後、それに応じて、ステージシーンの幅と高さのプロパティをこのレイアウトのプロパティにバインドします。バインディングの詳細については、JavaFXプロパティの使用とバインディングを参照してください。一方向バインディング
    の例
于 2012-04-25T16:03:58.183 に答える