如何在 TreeItem JavaFX 上添加 KeyListener?

How to add KeyListener on a TreeItem JavaFX?

我有一个带有 TreeView 的项目,我希望如果我 select 一个 TreeItem 并且我键入 DELETE,与其相关的文件会自动从磁盘上删除。但它不起作用,我只是通过在 Internet 上搜索找不到答案。这是我的功能(listeArbres 是一个 TreeView):

private void recupereFichierProjet(File repertoire, FileFilter filtre) {
    File[] fichiers = repertoire.listFiles(filtre);
    TreeItem<String> rootItem = new TreeItem<String>("Workspace");
    rootItem.setExpanded(true);

    for (File fichier : fichiers) {
        Projet projet = Projet.charge(fichier);
        TreeItem<String> item = new TreeItem<String>(fichier.getName());
        item.addEventHandler(KeyEvent.KEY_TYPED, event -> {
            if (event.getCode() == KeyCode.DELETE) {
                System.out.println("la");
                Projet.supprime(
                        new File("./workspace/" + listeArbres.getSelectionModel().getSelectedItem().getValue()));
                initialiseTreeView();
            }
        });
        rootItem.getChildren().add(item);
        for (Arbre arbre : projet.getArbreDuProjet()) {
            TreeItem<String> itemBis = new TreeItem<String>(arbre.getEntete().getNomFonction());
            item.getChildren().add(itemBis);
        }
    }
    listeArbres.setRoot(rootItem);
    listeArbres.setVisible(true);
}

我想我知道 addEventHandler 用于不同的事件,所以我不明白如何在对象上使用 KeyListener 'Item'。

'Projet' 上的静态方法 'supprime' 用于删除我的文件。

先谢谢你。(抱歉我的英语不好)。

TreeItem documentation 中所述(在 "TreeItem Events" 下):

It is important to note however that a TreeItem is not a Node, which means that only the event types defined in TreeItem will be delivered. To listen to general events (for example mouse interactions), it is necessary to add the necessary listeners to the cells contained within the TreeView (by providing a cell factory).

但是,对于按键操作,实际单元格不会获得键盘焦点,因此它们不会接收按键事件。所以你真正想要的是当 TreeView 有焦点并且按下删除键时,然后删除树中的选定项。所以你需要

TreeView<String> tree = ... ;

tree.setOnKeyPressed(e -> {
    TreeItem<String> selected = tree.getSelectionModel().getSelectedItem();
    if (selected != null && e.getCode() == KeyCode.DELETE) {
        System.out.println("Delete pressed on "+selected.getValue());
        // delete file associated with selected.getValue()...
    }
});

一些其他注意事项:

  1. 按键输入事件没有与之关联的代码 (see docs)。此处需要按键事件,而不是按键输入事件。
  2. 由于您的树视图似乎正在显示文件,因此拥有 TreeView<File> 并修改单元格实现中的 updateItem 方法以显示名称可能(更有意义)的文件。然后在listener里直接用getItem()就可以拿到文件了,删除的代码就简单多了