给出以下布局:
在某些情况下, Field 2 (以及上面对应的Label
)是不可见的, Field 3 和 Field 4 应该是向左移动。
我的第一次尝试是将元素放在Pane
中(就像我在本例中的屏幕截图中所做的那样)并重新计算所有元素的确切位置(如果一个元素设置为不可见)。此解决方案正在运行,但如果元素,其大小或顺序发生变化,则需要大量维护。
在讨论另一个问题的过程中,我想到了使用HBox
将字段放入其中,这会给我自动间距。
但使用HBox
并不能解决问题,因为:
HBox
中看到,标签不能设置在元素上方。如何归档我想要的行为?
答案 0 :(得分:2)
将每个Label
与ComboBox/Label
放入VBox
。然后根据您的要求在HBox
添加/删除它们。另一个解决方案是将所有内容放入GridPane
并添加/删除列。
答案 1 :(得分:2)
使Node
不可见不会将其从布局中删除。从父布局中删除节点由
Node
managed
属性设置为false
。使用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();
}