匿名类中的Java方法调用
我有一个关于这段代码的问题(复制自java2s.com):匿名类中的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
私有树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();
}
}