有人能帮助我吗?我是JavaFX和FXML的新手,我已经尝试过无数个小时试图做一些没有运气的事情。 有人可以告诉我一个代码的工作示例
1)加载一个包含节点(如标签和按钮)的FXML,这些节点在不同的窗格和节点内嵌套了几层;
2)遍历列出节点的整个场景(例如标签和按钮);
3)将Java代码耦合到节点(例如标签和按钮),以便我可以在为FXML定义的控制器类之外更改其属性(例如它的标签和内容)。
我的目标是使用Scene Builder构建UI,然后能够动态更改场景的内容以及向其添加其他节点。我的问题是我无法到达场景/舞台中的物体。
以下是我一直在使用的代码。评论表明我是什么 寻找。
//
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Sample.fxml"));
Parent root = (Parent)fxmlLoader.load();
SampleController controller = (SampleController)fxmlLoader.getController();
controller.label.setText("Label text has been set");
controller.button.setText("Button text has been set");
// Looking for an example of traversing all the objects within the controller
// looking for an object such as a TableView and its columns. Would like to
// attach code outside the controller which populates the TableView.
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
答案 0 :(得分:0)
您必须递归获取root
容器中的所有节点:
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Sample.fxml"));
Parent root = (Parent)fxmlLoader.load();
List<Node> allNodes = getAllNodes(root);
for(Node node : allNodes) {
// do some stuff…
}
…
}
private List<Node> getAllNodes(Parent container) {
List<Node> nodes = new ArrayList<Node>();
for(Node node : container.getChildrenUnmodifiable())
{
nodes.add(node);
if (node instanceof Parent) {
Parent subContainer = (Parent) node;
nodes.addAll( getAllNodes(subContainer) );
}
}
return nodes;
}
您可以像访问控制台一样访问控制器的@FXML字段(例如TableView)...: - )
此外,TableView
中有一种获取列的方法,例如controller.tableView.getColumns()…
只需持有一个全局控制器实例即可从任何地方访问它。
干杯