4

私はJavaFX、外部データ構造から生成されたレイアウトを持つアプリケーションに取り組んでいます。

  • 独自の縦横比を知っているコンポーネントを表示する (高さは幅に依存)
  • 2種類の構造部品
    • ページ全体で同じ幅ですべての子を表示し、各子は必要なだけ垂直方向のスペースを広げます
    • 全幅を使用し、必要なだけ垂直方向のスペースを取って、すべての子をページの下に表示します

しかし、期待どおりに表示されないことがわかりました。問題を示す簡単なケースを作成しました。

コードは以下のとおりです。問題はv3表示されないことであり、私の人生では理由がわかりません。私が理解していないVBoxes とesのいくつかの側面があると思います。HBox

助けやアイデアをいただければ幸いです。前もって感謝します!

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

import java.util.Random;

public class Test extends Application {

    static Random rand = new Random();

    public static void main(String args[]) {
        Application.launch("something");
    }

    @Override
    public void start(Stage mainStage) throws Exception {
        testVBoxes(mainStage);
    }

    private void testVBoxes(Stage mainStage) {
        VBox root = new VBox();
        Scene one = new Scene(root, 800, 600, Color.WHITE);

        FixedAspectRatioH h1 = new FixedAspectRatioH();
        FixedAspectRatioH h2 = new FixedAspectRatioH();
        FixedAspectRatioH h3 = new FixedAspectRatioH();
        FixedAspectRatioV v1 = new FixedAspectRatioV();
        FixedAspectRatioV v2 = new FixedAspectRatioV();
        FixedAspectRatioV v3 = new FixedAspectRatioV();

        h1.prefWidthProperty().bind(root.widthProperty());

        h2.add(v2);

        v1.add(h3);
        v1.add(h2);

        h1.add(v1);
        h1.add(v3);

        root.getChildren().add(h1);

        mainStage.setScene(one);
        mainStage.show();
    }

    private class FixedAspectRatioV extends VBox {
        public FixedAspectRatioV() {
            Rectangle r = new Rectangle();
            r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256),     rand.nextInt(256)));
            r.widthProperty().bind(widthProperty());
            r.heightProperty().bind(r.widthProperty().divide(3));
            getChildren().add(r);
        }

        public void add(Region n) {
            n.prefWidthProperty().bind(widthProperty());
            getChildren().add(n);
        }
    }

    private class FixedAspectRatioH extends HBox {
        public FixedAspectRatioH() {
            Rectangle r = new Rectangle();
            r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256),     rand.nextInt(256)));
            r.widthProperty().bind(widthProperty().divide(4));
            r.heightProperty().bind(r.widthProperty());
            getChildren().add(r);
        }

        public void add(Region n) {
            HBox.setHgrow(n, Priority.ALWAYS);
            getChildren().add(n);
        }
    }
}
4

1 に答える 1

0

その2年ですが、解決策はあなたが忘れていることです

Node.setPrefSize(width,height);

また、これをコンストラクターに追加しますHbox.setFillHeight(true);

于 2015-07-07T11:11:22.127 に答える