似乎在FXML中如果不指定ID(CSS),则默认使用fx:id值。我之前的理解是两个是完全不相交的,CSS的CSS和只有CSS。 fx:控制器中@FXML绑定的id。
这可以通过一个小测试来证明 - 三个按钮,首先是ID,第二个是FX:ID,第三个是两种类型的ID。
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Button id="cssid0" mnemonicParsing="false" text="Button" />
<Button fx:id="fxid1" mnemonicParsing="false" text="Button" />
<Button id="cssid2" fx:id="fxid2" mnemonicParsing="false" text="Button" />
</children>
</VBox>
使用Node.lookup(cssSelector)允许通过fx:id
进行选择@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"));
Parent p = loader.load();
System.out.println(p.lookup("#cssid0")); // => Button[id=cssid0, styleClass=button]'Button'
System.out.println(p.lookup("#fxid1")); // => Button[id=fxid1, styleClass=button]'Button'
System.out.println(p.lookup("#fxid2")); // => null (if there is a CSS ID it takes precedent)
System.out.println(p.lookup("#cssid2")); // Button[id=cssid2, styleClass=button]'Button'
stage.setScene(new Scene(p, 200, 200));
stage.getScene().getStylesheets().add("/foo.css");
stage.show();
}
CSS也允许通过fx:ID
进行选择#cssid0 {
-fx-color: red;
}
#fxid1 {
-fx-color: green;
}
#cssid2 {
-fx-color: blue;
}
现有问题What's the difference between fx:id and id: in JavaFX?,Node.getId()的Javadoc或我能找到的任何其他地方似乎都没有涵盖这一点。
这个功能非常有用,因为我们只需要指定一个fx:id,它可以用于控制器,CSS和使用test-FX的单元测试。
使用这种方法是否可以,或者我是否构建了可能在以后版本中更改的未记录行为的假设?或者它记录在某个我遗失的地方?
答案 0 :(得分:3)
IMO在Introduction to FXML :: Variable Resolution中有部分记录。但初看起来并不那么明显:
为元素分配fx:id值会在。中创建一个变量 文档的命名空间,以后可以通过变量引用 取消引用属性......
此外,如果对象的类型定义 一个&#34; id&#34;属性,此值也将传递给对象 setId()方法。
如果对象定义了idProperty并且尚未设置,那么它应该用&#34;#34;来完成。基于相关的源代码位于FXMLLoader的708左右:
// Add the value to the namespace
if (fx_id != null) {
namespace.put(fx_id, value);
// If the value defines an ID property, set it
IDProperty idProperty = value.getClass().getAnnotation(IDProperty.class);
if (idProperty != null) {
Map<String, Object> properties = getProperties();
// set fx:id property value to Node.id only if Node.id was not
// already set when processing start element attributes
if (properties.get(idProperty.value()) == null) {
properties.put(idProperty.value(), fx_id);
}
}
...
}
我认为可以建立这种行为。