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
:
中的其他代码调用
我有一个关于这段代码的问题(从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:
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
: