为了账号安全,请及时绑定邮箱和手机立即绑定

循环遍历 FXML 元素并将其中一些元素添加到列表时遇到问题

循环遍历 FXML 元素并将其中一些元素添加到列表时遇到问题

幕布斯6054654 2023-08-04 14:40:14
仍然很难让我的循环正常工作。期待:我正在构建一个简单的 JavaFX 应用程序,其 UI 通过几个 TextFields 和几个按钮接受输入。我已经构建了一个&ldquo;重置&rdquo;按钮,该按钮应该清除所有文本字段中的文本,但我无法让它工作。该按钮的方法在 FXML 元素上循环,我希望它能够识别 TextFields 并将它们添加到列表中:private List<TextField> identifyTextFields(Pane parent) {    List<TextField> textFieldList = new ArrayList<>();    for (Node element : parent.getChildren()) {        if (element instanceof Pane) {            // if element is a container, scan its children            scanNodesForTextFields((Pane) element);            //This line is always false. Why?            if (element instanceof TextField) {                textFieldList.addAll(scanNodesForTextFields((Pane) element));            }        } else if (element instanceof TextField) {            textFieldList.add((TextField) element);        }    }    return textFieldList;}然后,textFieldList 返回到此方法,其中循环并清除 textField: @FXMLpublic void resetButtonClicked(ActionEvent event) {    List<TextField> textFieldList = identifyTextFields(parentNode);    for (TextField textField : textFieldList) {        textField.setText("");    }}现实:在里面identifyTextFields(Pane parent)方法,这一行始终为 false:if (element instanceof TextField) {我不懂为什么。我试图从根节点(即锚点窗格)开始循环遍历 FXML 场景图的所有元素。如果内部循环发现其中一个元素是 TextField,则应将其添加到列表中...但它永远不会找到任何 TextField。我在理解调试结果方面也遇到了一些困难,但在我看来,该方法甚至没有访问 TextFields;就好像它直接跳过它们一样。我的方法有什么问题吗?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以使用基于“TextField”CSS 类型的 CSS 选择器的查找来递归查找给定父节点的所有文本字段。


@SuppressWarnings("unchecked")

private Set<TextField> lookupTextFields(Parent parent) {

    return (Set<TextField>)(Set<?>) parent.lookupAll("TextField");

}

奇怪的类型铸造来自:

  • 如何将超类型列表转换为子类型列表?


有时,为了使查找正常运行,您需要生成布局通道;看:

  • 获取JavaFX中节点的高度(生成布局通道)

这是通过在调用之前调用以下命令来完成的lookupAll

parent.applyCss();
parent.layout();

但是,对于您的特定情况,不太可能需要生成布局过程。FXML 加载器在 FXML 加载调用期间已经构造了足够的场景图,基于“TextField”css 选择器的查找将起作用。



查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信