繁体   English   中英

匿名类中的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”方法。 因为TreeItem-anonymousclass的任何方法都没有在“启动”函数中调用。 仅调用方法“ createNode”来初始化TreeItem。

最好的问候史蒂夫

在您提供的代码中, buildChildren(..) getChildren()调用buildChildren(..) getChildren() 由于此方法将覆盖超类的方法,因此我们可以查阅超类的JavaDoc

public ObservableList<TreeItem<T>> getChildren()

此TreeItem的子级。 经常调用此方法,因此建议任何TreeItem实现都缓存返回的列表。

返回 :一个列表,其中包含属于TreeItem的子TreeItems。

这提供了一个事实,即代码使用的JavaFX库调用了此方法。

如果您想知道何时确切调用此方法,可以使用调试器在getChildren()方法上设置一个断点。 在Eclipse中运行此代码时,我发现单击以在GUI中展开根TreeItem时首先调用getChildren() 调试器视图显示, buildChildren()确实由getChildren()调用,而getChildren()又由TreeItem的其他代码调用:

为getChildren调用堆栈

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM