Java FX:场景的查找方法



如果一个节点具有fx:id(假设a)以及正常id(css id)(假设b)。如果使用查找来搜索该节点:

节点节点= scene.lookup("#")

上面的语句返回null。但如果讨论的节点没有对应的css id,则上述语句返回正确的节点。

使用下面给定的语句总是返回正确的结果:

节点节点= scene.lookup (b"#")

谁能解释一下为什么查找方法的行为如此奇怪?

<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<GridPane hgap="14.0" maxHeight="+Infinity" maxWidth="+Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="223.0" prefWidth="323.0" vgap="20.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
  <children>
    <VBox maxHeight="+Infinity" maxWidth="+Infinity" minHeight="-Infinity" spacing="7.0" GridPane.rowIndex="0">
      <children>
            <HBox alignment="TOP_RIGHT">
               <children>
              <Label fx:id="headerMessage" text="message" textAlignment="LEFT" wrapText="true">
                <font>
                  <Font name="System Bold" size="13.0" />
                </font>
              </Label>
               </children>
            </HBox>
            <HBox alignment="TOP_RIGHT" spacing="5.0">
               <children>
              <Label fx:id="qty" text="details" textAlignment="LEFT" wrapText="true">
                <font>
                  <Font size="12.0" />
                </font>
              </Label>
                  <TextField fx:id="qtyT" />
               </children>
            </HBox>
            <HBox alignment="TOP_RIGHT" spacing="5.0">
               <children>
                  <Label fx:id="name" text="details" textAlignment="LEFT" wrapText="true">
                     <font>
                        <Font size="12.0" />
                     </font>
                  </Label>
                  <TextField fx:id="nameT" />
               </children>
            </HBox>
            <HBox alignment="TOP_RIGHT" spacing="5.0">
               <children>
                  <Label fx:id="remarks" text="details" textAlignment="LEFT" wrapText="true">
                     <font>
                        <Font size="12.0" />
                     </font>
                  </Label>
                  <TextArea fx:id="remarksT" prefHeight="60.0" prefWidth="149.0" wrapText="true" />
               </children>
            </HBox>
      </children>
    </VBox>
    <HBox maxHeight="-Infinity" maxWidth="+Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="253.0" GridPane.rowIndex="1">
      <children>
        <Pane maxWidth="+Infinity" HBox.hgrow="ALWAYS" />
        <Button id="cancel-button" fx:id="cancelButton" cancelButton="true" minWidth="80.0" mnemonicParsing="false" text="Cancel" HBox.hgrow="NEVER">
          <HBox.margin>
            <Insets />
          </HBox.margin>
        </Button>
        <HBox fx:id="okParent" alignment="CENTER">
          <children>
            <Button id="ok-button" fx:id="okButton" minWidth="80.0" mnemonicParsing="false" text="Ok" HBox.hgrow="NEVER">
              <HBox.margin>
                <Insets left="14.0" />
              </HBox.margin>
            </Button>
          </children>
        </HBox>
      </children>
    </HBox>
  </children>
  <columnConstraints>
    <ColumnConstraints halignment="CENTER" hgrow="ALWAYS" maxWidth="+Infinity" minWidth="-Infinity" />
  </columnConstraints>
  <padding>
    <Insets bottom="14.0" left="14.0" right="14.0" top="14.0" />
  </padding>
  <rowConstraints>
    <RowConstraints maxHeight="+Infinity" minHeight="-Infinity" valignment="CENTER" vgrow="ALWAYS" />
    <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" vgrow="NEVER" />
  </rowConstraints>
</GridPane>

在上面的fxml中,查找对于没有任何css id的节点的fxml id工作得很好。如果css id存在,那么它返回null

Label headerMessage = (Label) alertStage.getScene().lookup("#headerMessage");
                final TextField qty = (TextField) alertStage.getScene().lookup("#qtyT");
                Label name = (Label) alertStage.getScene().lookup("#name");
                final TextArea remarksT = (TextArea) alertStage.getScene().lookup("#remarksT");
                final TextField nameT = (TextField) alertStage.getScene().lookup("#nameT");

查找方法仅在下列语句中失败。

Button okButton = (Button) alertStage.getScene().lookup("#okButton");

Edit - OP添加MCVE后

深入调查此事。我在FXML文档的深处写了一个简单的语句,它解释了这种行为。实际上,通过调用setId(), fx:id被分配为控件/布局的default id

除非被覆盖,否则fx:id保持为对象default id

FXML简介:

为元素分配fx:id值会在文档的名称空间中创建一个变量,稍后可以通过变量解引用属性(如上面所示的"toggleGroup"属性)或脚本代码引用该变量,这将在后面的小节中讨论。另外,如果对象的类型定义了一个"id"属性,这个值也将传递给对象的setId()方法。

lookup()正在完美地完成它的工作,并且正在为CSS selectors而不是fx:id工作。

相关内容

  • 没有找到相关文章

最新更新