Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环使用FXML元素并将其中一些元素添加到列表时出现问题_Java_Loops_Javafx_Fxml - Fatal编程技术网

Java 循环使用FXML元素并将其中一些元素添加到列表时出现问题

Java 循环使用FXML元素并将其中一些元素添加到列表时出现问题,java,loops,javafx,fxml,Java,Loops,Javafx,Fxml,我发现这很有帮助,但是我仍然很难让我的循环正常工作 期望值: 我正在构建一个简单的JavaFX应用程序,它有一个UI,通过几个文本字段和几个按钮获取输入。我已经建立了一个“重置”按钮,可以清除所有文本字段中的文本,但我无法让它工作 按钮的方法在FXML元素上循环,我希望它能够识别文本字段并将它们添加到列表中: private List<TextField> identifyTextFields(Pane parent) { List<TextField> tex

我发现这很有帮助,但是我仍然很难让我的循环正常工作

期望值:

我正在构建一个简单的JavaFX应用程序,它有一个UI,通过几个文本字段和几个按钮获取输入。我已经建立了一个“重置”按钮,可以清除所有文本字段中的文本,但我无法让它工作

按钮的方法在FXML元素上循环,我希望它能够识别文本字段并将它们添加到列表中:

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;
}
方法,此行始终为false:

if (element instanceof TextField) {
我不明白为什么。我试图循环遍历FXML场景图的所有元素,从根节点开始,它是一个锚窗格。如果内部循环发现其中一个元素是TextField,则应将其添加到列表中……但它将永远找不到任何TextFields

我在理解调试结果方面也有点困难,但在我看来,该方法甚至没有访问文本字段;就好像它从他们身上跳了过去

我的方法怎么了

作为参考,这里是场景图的一部分,其中包括我要定位的6个文本字段:

<AnchorPane fx:id="parentNode" prefHeight="758.0" 
prefWidth="662.0" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="Controller">
   <children>
  ...snip...
       <HBox fx:id="textFieldContainer" layoutY="378.0" prefHeight="100.0" prefWidth="660.0">
                 <children>
                    <VBox prefHeight="100.0" prefWidth="110.0">
                       <children>
                          <Label text="1">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldOne">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="100.0" prefWidth="110.0">
                       <children>
                          <Label text="2">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldTwo">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="3">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldThree">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="4">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldFour">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="5">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldFive">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="6">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldSix">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                 </children></HBox>
           ...snip...

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

@SuppressWarnings("unchecked")
private Set<TextField> lookupTextFields(Parent parent) {
    return (Set<TextField>)(Set<?>) parent.lookupAll("TextField");
}

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

当您检查它是否是
TextField
实例时,您的
元素
始终是一个
窗格。仔细看看你的
if
语句……答对了。谢谢你,伙计。
<AnchorPane fx:id="parentNode" prefHeight="758.0" 
prefWidth="662.0" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="Controller">
   <children>
  ...snip...
       <HBox fx:id="textFieldContainer" layoutY="378.0" prefHeight="100.0" prefWidth="660.0">
                 <children>
                    <VBox prefHeight="100.0" prefWidth="110.0">
                       <children>
                          <Label text="1">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldOne">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="100.0" prefWidth="110.0">
                       <children>
                          <Label text="2">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldTwo">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="3">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldThree">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="4">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldFour">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="5">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldFive">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                    <VBox prefHeight="200.0" prefWidth="110.0">
                       <children>
                          <Label text="6">
                             <padding>
                                <Insets left="30.0" />
                             </padding>
                             <font>
                                <Font name="Calibri" size="16.0" />
                             </font>
                          </Label>
                          <TextField fx:id="textFieldSix">
                             <VBox.margin>
                                <Insets top="10.0" />
                             </VBox.margin>
                          </TextField>
                       </children>
                    </VBox>
                 </children></HBox>
           ...snip...
@SuppressWarnings("unchecked")
private Set<TextField> lookupTextFields(Parent parent) {
    return (Set<TextField>)(Set<?>) parent.lookupAll("TextField");
}
parent.applyCss();
parent.layout();