JavaFX:连续布局节点

时间:2017-10-20 05:14:41

标签: java javafx javafx-8

给出以下布局:

enter image description here

在某些情况下, Field 2 (以及上面对应的Label)是不可见的, Field 3 Field 4 应该是向左移动。

我的第一次尝试是将元素放在Pane中(就像我在本例中的屏幕截图中所做的那样)并重新计算所有元素的确切位置(如果一个元素设置为不可见)。此解决方案正在运行,但如果元素,其大小或顺序发生变化,则需要大量维护。

在讨论另一个问题的过程中,我想到了使用HBox将字段放入其中,这会给我自动间距。

但使用HBox并不能解决问题,因为:

  1. 据我在HBox中看到,标签不能设置在元素上方。
  2. 如果我将元素设置为不可见,则其他元素不会向左移动。
  3. 如何归档我想要的行为?

2 个答案:

答案 0 :(得分:2)

将每个LabelComboBox/Label放入VBox。然后根据您的要求在HBox添加/删除它们。另一个解决方案是将所有内容放入GridPane并添加/删除列。

答案 1 :(得分:2)

使Node不可见不会将其从布局中删除。从父布局中删除节点由

完成
  1. 从父
  2. 的子列表中删除Node
  3. 将节点的managed属性设置为false
  4. 使用managed属性显示/隐藏节点的示例:

    public static void toggleVisibility(Node node) {
        boolean newValue = !node.isVisible();
        node.setVisible(newValue);
    
        // invisible nodes should not be taken into account for HBox layout
        node.setManaged(newValue);
    }
    
    @Override
    public void start(Stage primaryStage) {
        Rectangle rect1 = new Rectangle(100, 100, Color.RED.deriveColor(0, 1, 1, 0.5));
        Rectangle rect2 = new Rectangle(100, 100, Color.GREEN.deriveColor(0, 1, 1, 0.5));
        Rectangle rect3 = new Rectangle(100, 100, Color.BLUE.deriveColor(0, 1, 1, 0.5));
        HBox hbox = new HBox(rect1, rect2, rect3);
    
        Scene scene = new Scene(hbox);
        scene.setOnMouseClicked(evt -> {
            toggleVisibility(rect2);
        });
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }