JavaFX VBox and HBox layouts

匿名 (未验证) 提交于 2019-12-03 01:22:02

问题:

I'm working on a JavaFX application which has a layout generated from an external data structure, composed of

  • displaying components that know their own aspect ratios (height as a dependent of width)
  • 2 types of structural components that
    • display all children with an equal width across their page, each child up as much vertical space as needed
    • display all children down the page using the full width and taking as much vertical space as needed

But I'm finding things aren't displaying as I expect. I've made a simplified case that demonstrates the problem.

The code is below, and the problem is that v3 doesn't get displayed, and I can't for the life of me work out why. I guess there's some facet of VBoxes and HBoxes that I haven't understood.

I'd really appreciate any help or ideas. Thanks in advance!

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);         }     } } 

回答1:

its 2 years but the solution is you forgot

Node.setPrefSize(width,height); 

and also add this to your constructor Hbox.setFillHeight(true);



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!