在控制器类外部动态访问/遍历/操作从FXML创建的JavaFX节点

在控制器类外部动态访问/遍历/操作从FXML创建的JavaFX节点,javafx,fxml,Javafx,Fxml,有人能帮帮我吗。我是JavaFX和FXML的新手,我已经尝试了无数个小时,试图做一些没有任何运气的事情。 有人能给我看一个代码的工作示例吗 1加载一个FXML,该FXML包含嵌套在不同窗格和节点中数层深处的节点,如标签和按钮 2遍历整个场景,列出标签和按钮等节点 3将Java代码耦合到一个节点,比如label和button,这样我就可以在为FXML定义的控制器类之外更改它的属性,比如它的label和内容 我的目标是使用场景生成器构建UI,然后能够动态更改场景的内容,并向其中添加其他节点。我的问题

有人能帮帮我吗。我是JavaFX和FXML的新手,我已经尝试了无数个小时,试图做一些没有任何运气的事情。 有人能给我看一个代码的工作示例吗

1加载一个FXML,该FXML包含嵌套在不同窗格和节点中数层深处的节点,如标签和按钮

2遍历整个场景,列出标签和按钮等节点

3将Java代码耦合到一个节点,比如label和button,这样我就可以在为FXML定义的控制器类之外更改它的属性,比如它的label和内容

我的目标是使用场景生成器构建UI,然后能够动态更改场景的内容,并向其中添加其他节点。我的问题是我无法到达场景/舞台中的对象

下面是我一直在使用的部分代码。这些评论暗示了我的想法 寻找

//


必须递归地获取根容器中的所有节点:

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

只需全局保存控制器的一个实例,就可以从任何地方访问它


干杯

请发布一个FXML示例和您想要的输出。
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;
}