如何在TreeItem JavaFX上添加KeyListener?

时间:2016-01-14 14:09:20

标签: java javafx treeview keylistener

我有一个带有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 个答案:

答案 0 :(得分:2)

TreeItem documentation中所述(在“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. 键入的事件没有与之关联的代码(see docs)。您需要在此处按键事件,而不是键入事件。
  2. 由于您的树视图似乎正在显示文件,因此有可能(更多)有TreeView<File>并修改单元格实现中的updateItem方法以显示其名称文件。然后,您可以在侦听器中直接使用getItem()获取文件,并且删除它的代码将更加容易。