Java 匿名方法调用 类

Java Method call in anonymous classes

我有一个关于这段代码的问题(从java2s.com复制出来):

  private TreeItem<File> createNode(final File f) {
    return new TreeItem<File>(f) {
      private boolean isLeaf;
      private boolean isFirstTimeChildren = true;
      private boolean isFirstTimeLeaf = true;

      @Override
      public ObservableList<TreeItem<File>> getChildren() {
        super.getChildren().setAll(buildChildren(this));
        return super.getChildren();
      }

      @Override
      public boolean isLeaf() {
        return isLeaf;
      }

      private ObservableList<TreeItem<File>> buildChildren(
          TreeItem<File> TreeItem) {
        File f = TreeItem.getValue();
        if (f == null) {
          return FXCollections.emptyObservableList();
        }
        if (f.isFile()) {
          return FXCollections.emptyObservableList();
        }
        File[] files = f.listFiles();
        if (files != null) {
          ObservableList<TreeItem<File>> children = FXCollections
              .observableArrayList();
          for (File childFile : files) {
            children.add(createNode(childFile));
          }
          return children;
        }
        return FXCollections.emptyObservableList();
      }
    };
  }

  @Override
  public void start(Stage stage) {
    Scene scene = new Scene(new Group(), 300, 300);
    VBox vbox = new VBox();

    TreeItem<File> root = createNode(new File("c:/"));
    TreeView treeView = new TreeView<File>(root);

    vbox.getChildren().add(treeView);
    ((Group) scene.getRoot()).getChildren().add(vbox);

    stage.setScene(scene);
    stage.show();
  }
}

我不是很明白为什么,比如调用"buildChildren"方法。 因为 none TreeItem-anonymousclass 的方法曾经在 "start" 函数。仅调用方法 "createNode" 初始化 TreeItem。

此致 史蒂夫

在您提供的代码中,buildChildren(..) 仅从 getChildren() 调用。由于此方法覆盖了超级 class 中的方法,我们可以参考超级 class:

JavaDoc

public ObservableList<TreeItem<T>> getChildren()

The children of this TreeItem. This method is called frequently, and it is therefore recommended that the returned list be cached by any TreeItem implementations.

Returns: a list that contains the child TreeItems belonging to the TreeItem.

这提供了一个线索,说明此方法是由代码使用的 JavaFX 库调用的。

如果您想知道此方法的确切调用时间,您可以使用调试器在 getChildren() 方法处设置断点。当在 Eclipse 中 运行 这段代码时,我发现在 GUI 中单击展开根 TreeItem 时首先调用 getChildren()。调试器视图显示 buildChildren() 确实被 getChildren() 调用,后者又被 TreeItem:

中的其他代码调用