如何在JavaFX的TreeItem上添加KeyListener?

3

我有一个带有TreeView的项目,如果我选择一个TreeItem并输入DELETE,则与之相关的文件将自动在磁盘上删除。但它不起作用,我通过在互联网上搜索找不到答案。这是我的函数(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是用于不同事件的,所以我不明白如何在“Item”对象上使用KeyListener。

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

提前感谢您。(对我的糟糕英语表示抱歉)。

1个回答

4
TreeItem文档(在“TreeItem事件”下)中所述:

需要注意的是,TreeItem不是Node,这意味着仅传递在TreeItem中定义的事件类型。 要监听一般事件(例如鼠标交互),必须向TreeView内包含的单元格添加必要的侦听器(通过提供单元格工厂)。

但是,对于按键,实际的单元格不会获得键盘焦点,因此它们不会接收到按键事件。 所以您真正想要的是当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. 按键事件不会与任何代码相关联(请参见文档)。您需要一个按键按下事件,而不是按键输入事件。
  2. 由于您的树形视图似乎正在显示文件,因此使用 TreeView<File> 并修改单元格实现中的 updateItem 方法以显示文件名称可能更加合理(大大)简化了删除文件的代码,然后您可以在侦听器中直接获取文件使用 getItem()

我无法使用Cell类,但通过setOnKeyPressed当我按下键时有响应 :) 非常感谢您快速的回答 James_D - BlaCkOmN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接