JavaFX - 可重用的 FXML 组件
JavaFX - Reusable FXML component
我正在使用 Scene Builder 构建一个 GUI,我的大部分场景都有一个共同元素(底部有一个 iOS 类型的主页按钮)。
我想知道是否可以在单独的 fxml 文件中定义此组件。根据我进行的研究,存在用于声明可重用组件的类似过程,但仅在同一 fxml 文件中。
我如何将此原则应用于多个 fxml 文件?
这绝对可以通过创建一个单独的 FXML 文件并向其添加一个具有已知唯一 ID 的节点,然后通过该 ID 访问该节点来实现,棘手的部分是您将如何在应用程序范围内执行此操作?可能会在您的许多控制器中创建相同的功能,但这里是您如何从 FXML 文件中获取按钮。
所有按钮都执行相同的操作?
Parent root = FXMLLoader.load(getClass().getResource("fileName.fxml"));
ObservableList<Node> nodes = root.getChildrenUnmodifiable();
String _id = "testButton";
for (Node node : nodes) {
if (node.getId().equals(_id)) {
return node;
}
}
return null;
}
你可以这样做:
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.MainController">
<children>
<fx:include fx:id="someId" source="NestedFXML.fxml"/>
</children>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.NestedFXMLController">
</AnchorPane>
控制器类:
public class MainController implements Initializable {
@FXML
private NestedFXMLController someIdController;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
}
public class NestedFXMLController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
}
很好:可以通过 FXML 注释注入嵌套控制器。 字段名称必须匹配 fx:id 属性字符串 + "Controller"!
我正在使用 Scene Builder 构建一个 GUI,我的大部分场景都有一个共同元素(底部有一个 iOS 类型的主页按钮)。 我想知道是否可以在单独的 fxml 文件中定义此组件。根据我进行的研究,存在用于声明可重用组件的类似过程,但仅在同一 fxml 文件中。 我如何将此原则应用于多个 fxml 文件?
这绝对可以通过创建一个单独的 FXML 文件并向其添加一个具有已知唯一 ID 的节点,然后通过该 ID 访问该节点来实现,棘手的部分是您将如何在应用程序范围内执行此操作?可能会在您的许多控制器中创建相同的功能,但这里是您如何从 FXML 文件中获取按钮。
所有按钮都执行相同的操作?
Parent root = FXMLLoader.load(getClass().getResource("fileName.fxml"));
ObservableList<Node> nodes = root.getChildrenUnmodifiable();
String _id = "testButton";
for (Node node : nodes) {
if (node.getId().equals(_id)) {
return node;
}
}
return null;
}
你可以这样做:
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.MainController">
<children>
<fx:include fx:id="someId" source="NestedFXML.fxml"/>
</children>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.NestedFXMLController">
</AnchorPane>
控制器类:
public class MainController implements Initializable {
@FXML
private NestedFXMLController someIdController;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
}
public class NestedFXMLController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
}
很好:可以通过 FXML 注释注入嵌套控制器。 字段名称必须匹配 fx:id 属性字符串 + "Controller"!