如果一个节点具有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
工作。