我有一个带有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'用于删除我的文件。
事先谢谢。(抱歉我的英语不好)。
答案 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()...
}
});
其他几点说明:
TreeView<File>
并修改单元格实现中的updateItem
方法以显示其名称文件。然后,您可以在侦听器中直接使用getItem()
获取文件,并且删除它的代码将更加容易。