javafx 8在自定义控件中排序子项

javafx 8在自定义控件中排序子项,java,javafx-8,fxml,Java,Javafx 8,Fxml,我正在编写一个自定义控件,如果表单中的验证失败,它将在工具提示中显示一个错误图标和一条消息。没有自定义控件的我的版本如下所示: <HBox> <TextField fx:id="name"></TextField> <Label fx:id="error" focusTraversable="false" visible="false"> <graphic> <ImageVi

我正在编写一个自定义控件,如果表单中的验证失败,它将在工具提示中显示一个错误图标和一条消息。没有自定义控件的我的版本如下所示:

<HBox>
    <TextField fx:id="name"></TextField>
    <Label fx:id="error" focusTraversable="false" visible="false">
        <graphic>
            <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true"/>
        </graphic>
        <tooltip>
            <Tooltip fx:id="errorTooltip"/>
        </tooltip>
    </Label>
</HBox>
<ValidatedControl>
    <TextField>
    </TextField>
</ValidatedControl>
我可以使用fxml中的控件,但我添加的子组件始终是最后一个子组件,这意味着错误图标显示在其左侧

我的控件是这样使用的:

<HBox>
    <TextField fx:id="name"></TextField>
    <Label fx:id="error" focusTraversable="false" visible="false">
        <graphic>
            <ImageView fitHeight="24.0" fitWidth="24.0" pickOnBounds="true" preserveRatio="true"/>
        </graphic>
        <tooltip>
            <Tooltip fx:id="errorTooltip"/>
        </tooltip>
    </Label>
</HBox>
<ValidatedControl>
    <TextField>
    </TextField>
</ValidatedControl>


如何使其在右侧显示图标?

现在我确实理解了您的问题。当您在FXML中添加
ValidatedControl
时,这可能无法解决您的问题,但当您以编程方式添加时,请尝试以下操作:

ValidatedControl vc = new ValidatedControl();
TextField textField = new TextField();
vc.getChildren().add(textField);
textField.toBack();
另一种方法是按照ItachiUchiha的方式,作为第一个孩子在FXML中添加一个
窗格。但是不要覆盖
getChildren()
方法,而是编写一个新方法
addNode(Node n)
并将节点添加到窗格中


忘记我的第一个答案;)

我试过。。。版本这会产生相同的结果,因为我只将其用作占位符,告诉编译器/运行时将要添加到控件中的子项放在何处。对不起,如果我没有正确解释的话。“场景生成器”对自定义控件没有多大帮助:-(我明白了,你能发布自定义控件的java代码吗?请我已经添加了代码。顺便说一句,你为什么要将糟糕的场景生成器拖到这里面?这既不是问题的一部分,也不是解决方案。有多种方法可以实现这一点。一种方法是将
HBox
作为根目录。在它里面有另一个
HBox
和你的标签。重写
getChildren()
并从中返回子
HBox
的子节点。在使用自定义控件的第二个版本中,包含文本字段和错误图标的父节点是什么?能否显示fxml/Java布局,在其中布局文本字段和错误图标?@ItachiUchiha:我已经尝试了您的解决方案。在初始化期间,Java使用getCChildren要构建fxmlDOM[sic?],这意味着子HBox将是其自己的父项。结尾是一个IllegalArgumentException:子项:检测到的循环:父项=HBox[id=content],节点=HBox[id=content]