我对此代码有疑问(从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();
}
}
我真的不明白为什么,例如,&#34; buildChildren&#34;方法被调用。 因为没有调用TreeItem-anonymousclass的方法 &#34;开始&#34;功能。只需调用方法&#34; createNode&#34;初始化TreeItem。
祝你好运 史蒂夫
答案 0 :(得分:0)
在您提供的代码中,buildChildren(..)
仅从getChildren()
调用。由于这个方法覆盖了超类的方法,我们可以参考超类的JavaDoc:
public ObservableList<TreeItem<T>> getChildren()
这个TreeItem的孩子们。经常调用此方法,因此建议由任何TreeItem实现缓存返回的列表。
<强>返回强>: 包含属于TreeItem的子TreeItem的列表。
这给出了一个事实,即该方法由代码使用的JavaFX库调用。
如果您想知道何时调用此方法,可以使用调试器在getChildren()
方法中设置断点。在Eclipse中运行此代码时,我发现在单击以展开GUI中的根getChildren()
时首先调用TreeItem
。调试器视图显示buildChildren()
确实调用了getChildren()
,而TreeItem
中的其他代码又调用了Dim oContextMenu As CommandBar
Dim oContextMenuItem As CommandBarControl
'Make changes to the ActiceDocument only (this is needed to make any changes to this document).
CustomizationContext = ActiveDocument
For Each oContextMenu In ActiveDocument.CommandBars
If oContextMenu.Type = MsoBarType.msoBarTypePopup Then 'Loop through all the context menus of type (msoBarTypePopup)
For Each oContextMenuItem In oContextMenu.Controls
If (InStr(oContextMenuItem.Caption, "Smokeball")) Then
oContextMenuItem.Delete
End If
Next
End If
Next
: