我正在尝试将包含文件路径的工具提示附加到TreeItem<String>
,这样当我将鼠标悬停在此TreeItem上时,当我将鼠标悬停在它周围时,它将显示文件路径的文本。这在我的代码中不起作用,因为它抱怨我无法将其安装到String上。我该如何解决这个问题?
其次,我希望能够双击TreeItem然后它可以自动加载文件。我怎样才能做到这一点?
@FXML
TreeView<String> fxFileTree;
public void defineFileTree(){
TreeItem<String> root = new TreeItem<String>("Portfolio");
fxFileTree.setShowRoot(true);
root.setExpanded(true);
fxFileTree.setRoot(root);
}
public void populateTree(String fileName, String filePath){
addLeaf(fileName, (TreeItem<String>) fxFileTree.getRoot(), filePath);
}
public void addLeaf(String leaf, TreeItem<String> parent, String filePath{
TreeItem<String> item = new TreeItem<>(leaf);
Tooltip.install(item,filepath) // <- This is wrong
parent.getChildren().add(item);
}
更新:本练习的目标是构建一个仅包含根和一个分支级别的树,即root -> leaf1
(在此停止,没有孙子孙,仅限子项)。根将只是一个标题字符串。我想在根目录中添加叶子。叶子是文件对象。叶子的显示文本将是文件名,并为此叶子安装工具提示。工具提示将显示文件路径。
答案 0 :(得分:2)
您无法在TreeItem
上设置工具提示。 TreeItem
代表树中显示的数据,它们不是UI组件。您需要在TreeCell
上设置工具提示,您可以在工厂中进行操作。
由于您需要访问有关该文件的数据,因此您不应使用TreeView<String>
和TreeItem<String>
:您应该使用TreeView<File>
或TreeView<Path>
(换句话说,使树的数据类型为File
或Path
)。所以你会做类似的事情:
@FXML
private TreeView<Path> fxFileTree ;
private TreeItem<Path> root ;
// ...
public void initialize() {
fxFileTree.setCellFactory(tv -> {
final Tooltip tooltip = new Tooltip();
TreeCell<Path> cell = new TreeCell<Path>() {
@Override
public void updateItem(Path item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setTooltip(null);
} else if (getTreeItem() == root) {
setText("Portfolio");
setTooltip(null);
} else {
setText(item.getFileName().toString());
tooltip.setText(item.toRealPath().toString());
setTooltip(tooltip);
}
}
};
cell.setOnMouseClicked(e -> {
if (e.getClickCount() == 2 && ! cell.isEmpty()) {
Path file = cell.getItem();
// do whatever you need with path...
}
});
return cell ;
});
}
public void defineFileTree(){
root = new TreeItem<>(null);
fxFileTree.setShowRoot(true);
root.setExpanded(true);
fxFileTree.setRoot(root);
}
// ...