javafx:如何创建一个TreeItem,显示包含文件路径的工具提示并在双击时加载文件路径?

时间:2015-09-28 21:22:55

标签: java javafx

我正在尝试将包含文件路径的工具提示附加到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(在此停止,没有孙子孙,仅限子项)。根将只是一个标题字符串。我想在根目录中添加叶子。叶子是文件对象。叶子的显示文本将是文件名,并为此叶子安装工具提示。工具提示将显示文件路径。

1 个答案:

答案 0 :(得分:2)

您无法在TreeItem上设置工具提示。 TreeItem代表树中显示的数据,它们不是UI组件。您需要在TreeCell上设置工具提示,您可以在工厂中进行操作。

由于您需要访问有关该文件的数据,因此您不应使用TreeView<String>TreeItem<String>:您应该使用TreeView<File>TreeView<Path>(换句话说,使树的数据类型为FilePath)。所以你会做类似的事情:

@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);
}

// ...