当前位置: 首页 > 知识库问答 >
问题:

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

田兴朝
2023-03-14

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

1)加载一个包含节点(如标签和按钮)的FXML,这些节点嵌套在不同窗格和节点的几层深处;

2)遍历整个场景,列出节点(如标签和按钮);

//

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();
}

共有1个答案

戚哲
2023-03-14

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

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-field(例如TableView),就像您已经做过的一样…:-)

此外,TableView中有一个方法可以获取列,例如Controller.TableView.GetColumns()…

 类似资料:
  • 我需要操作控制器类中的元素。但是,我设法找到的每个示例都通过扩展应用程序的类执行此操作。 我需要操作文本字段输入来自 VBox样本控制器在类主。 操作如下: 期望的结果是一旦启动FXML应用程序,inputText TextField就会预先填充文本“TEST”。 我的困惑源于如何在任何地方操作此字段,但: VBoxSampleController 用户界面管理器 将VBoxsampleContr

  • 问题内容: 我想使用React.js制作一个应用程序。我希望它可以轻松地从外部进行自定义(例如,通过编写用户脚本)。我尝试使用的想法是在根元素状态(如或)中创建一些特殊的属性,以便插件开发人员可以在此处添加一些内容。我的问题是:这是否是一个好方法,是否有Right Way™实现与我的目标相似的目标,最后,插件开发人员将如何使用这些道具? 问题答案: 一种选择是可观察的。基本上,它是一个对象,您可以

  • 石英2.2 我在运行时动态创建和调度Quartz作业,并将Quartz配置为JDBC-Job-Store。这些作业需要在应用程序执行之间保持不变。在作业执行期间,我需要访问完整的Spring上下文(Spring管理的bean和JPA事务)。 然而,如果我试图将任何东西自动加入到我的工作中,那么我会得到一个错误,比如…“通过字段MyAutowiredField表示的不满足的依赖项” 我想不通。我已经

  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

  • 问题内容: 我有一堂课,还有另一个内部课: 问题答案: 从其他答案中可以看出,您将需要一个非静态内部类来执行此操作。 如果您确实不能使内部类成为非静态类,则可以在外部类中添加所需的getter和setter方法,并通过在内部静态类内部创建外部类的实例来访问它们:

  • 我很难弄清楚如何在JavaFX中动态创建节点,我正在尝试为消息传递程序创建一个接口,我希望每个消息都包含在自己的节点中。我不知道将发送多少消息,因此需要根据需要创建新节点。 这就是我到目前为止所做的,我希望这样我可以添加多个MessageNode对象并显示它们