匿名类中的Java方法调用

匿名类中的Java方法调用,java,class,methods,treeview,Java,Class,Methods,Treeview,我有一个关于这段代码的问题(复制自java2s.com): 私有树Item createNode(最终文件f){ 返回新树项(f){ 私有布尔isLeaf; 私有布尔值isFirstTimeChildren=true; 私有布尔值isFirstTimeLeaf=true; @凌驾 公共观察列表getChildren(){ super.getChildren().setAll(buildChildren(this)); 返回super.getChildren(); } @凌驾 公共布尔isLeaf

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

私有树Item createNode(最终文件f){
返回新树项(f){
私有布尔isLeaf;
私有布尔值isFirstTimeChildren=true;
私有布尔值isFirstTimeLeaf=true;
@凌驾
公共观察列表getChildren(){
super.getChildren().setAll(buildChildren(this));
返回super.getChildren();
}
@凌驾
公共布尔isLeaf(){
返回岛;
}
私人观察者儿童(
TreeItem TreeItem){
文件f=TreeItem.getValue();
如果(f==null){
返回FXCollections.emptyObservableList();
}
if(f.isFile()){
返回FXCollections.emptyObservableList();
}
File[]files=f.listFiles();
如果(文件!=null){
ObservableList children=FXCollections
.observableArrayList();
用于(文件子文件:文件){
添加(createNode(childFile));
}
返回儿童;
}
返回FXCollections.emptyObservableList();
}
};
}
@凌驾
公众假期开始(阶段){
场景=新场景(新组(),300,300);
VBox VBox=新的VBox();
TreeItem root=createNode(新文件(“c:/”));
TreeView TreeView=新的TreeView(根);
vbox.getChildren().add(treeView);
((组)scene.getRoot()).getChildren().add(vbox);
舞台场景;
stage.show();
}
}
例如,我真的不明白为什么要调用“buildChildren”方法。 因为TreeItem anonymousclass的任何方法都不会在 “启动”功能。只需调用方法“createNode”来初始化TreeItem

致意
Steve

在您提供的代码中,
buildChildren(..)
仅从
getChildren()
调用。由于此方法正在重写来自超类的方法,因此我们可以参考该超类的:

公共可观察列表getChildren()

这棵树的孩子们。此方法经常被调用,因此建议任何TreeItem实现都缓存返回的列表

返回: 包含属于树项的子树项的列表

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

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


我强烈怀疑
getChildren()
是由这些方法之一调用的。你试过调试代码来找出答案吗?
super.getChildren().setAll(buildChildren(this))
-此方法调用
buildChildren
,因此我假设它由
vbox.getChildren().add(treeView)调用
((组)scene.getRoot()).getChildren().add(vbox)
.buildChildren是createNode方法中调用的子方法,它最终用于start方法。从start方法开始调试代码以可视化代码流。为了完整性,这是。感谢您的解释,这真的很有帮助!我的意思是“getChildren”方法而不是“buildChildren”,但您为我提供了解决方案!:)干杯
  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();
  }
}