在javafx中将VBox宽度设置为较小的子节点的宽度

时间:2018-04-21 14:59:41

标签: javafx vbox

我正在试图找出如何让VBox使首选宽度为孩子宽度的较小值?实际上,我希望第二个孩子成为设置宽度的决定因素,然后第一个孩子的大小将适合VBox,因为它可以将文本包装在里面。

例如,我有一个包含两个HBox子节点的VBox,每个子节点都有一个标签。

VBox评估给所有孩子

但我想要的是让VBox通过较小的孩子来调整自己的大小:

VBox适合较小的孩子

VBox将设置对话框的场景,我的例程将由其他人通过函数给出第二个框,我想要第二个框来设置框的宽度而不是第一个可能会很长。

我不想使用固定数字来设置宽度,这就是我遇到这个问题的原因。

我是否可以仅使用XML中的参数执行此操作,或者我将不得不使用一些Java代码调用来将事物绑定在一起?

我在SceneBuilder中一直在玩这个没有成功。 fxml如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<VBox minHeight="-Infinity" minWidth="0.0" spacing="2.0" style="-fx-border-color: yellow;" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox id="box1" style="-fx-border-color: blue;">
         <children>
            <Label text="Text label one is really long" wrapText="true" />
         </children>
      </HBox>
      <HBox id="box2" style="-fx-border-color: red;">
         <children>
            <Label text="Text label two" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
   </padding>
</VBox>

1 个答案:

答案 0 :(得分:1)

box1的首选宽度绑定到box2的实际宽度。您可以在FXML中执行此操作(但可能不在Scene Builder中),但请注意,您需要box2 fx:id(而不是id)才能使其正常工作:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<VBox minHeight="-Infinity" minWidth="0.0" spacing="2.0" style="-fx-border-color: yellow;" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox id="box1" style="-fx-border-color: blue;" prefWidth="${box2.width}" >
         <children>
            <Label text="Text label one is really long" wrapText="true" />
         </children>
      </HBox>
      <HBox fx:id="box2" style="-fx-border-color: red;">
         <children>
            <Label text="Text label two" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
   </padding>
</VBox>

enter image description here