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]