Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在TreeItem JavaFX上添加KeyListener?_Java_Javafx_Treeview_Keylistener - Fatal编程技术网

如何在TreeItem JavaFX上添加KeyListener?

如何在TreeItem JavaFX上添加KeyListener?,java,javafx,treeview,keylistener,Java,Javafx,Treeview,Keylistener,我有一个带有TreeView的项目,我希望如果我选择一个TreeItem并键入DELETE,则与之相关的文件会在磁盘上自动删除。但它不起作用,我也不能仅仅通过在互联网上搜索来找到我的答案。这是我的函数(ListArbres是一个树状视图): private void recupereFichierProjet(文件目录、文件过滤器过滤器){ 文件[]fichiers=repertoire.listFiles(filter); TreeItem rootItem=新的TreeItem(“工作区”)

我有一个带有TreeView的项目,我希望如果我选择一个TreeItem并键入DELETE,则与之相关的文件会在磁盘上自动删除。但它不起作用,我也不能仅仅通过在互联网上搜索来找到我的答案。这是我的函数(ListArbres是一个树状视图):

private void recupereFichierProjet(文件目录、文件过滤器过滤器){
文件[]fichiers=repertoire.listFiles(filter);
TreeItem rootItem=新的TreeItem(“工作区”);
setExpanded(true);
用于(文件fichier:fichiers){
Projet Projet=Projet.charge(费希尔);
TreeItem=newTreeItem(fichier.getName());
item.addEventHandler(KeyEvent.KEY_类型,事件->{
if(event.getCode()==KeyCode.DELETE){
系统输出打印项次(“la”);
超级项目(
新文件(“./workspace/”+listerbres.getSelectionModel().getSelectedItem().getValue());
initialiseTreeView();
}
});
rootItem.getChildren().add(项);
对于(Arbre-Arbre:projet.getarbredupjet()){
TreeItemBis=新的TreeItem(arbre.getEntete().getNomfonAction());
item.getChildren().add(itemBis);
}
}
listerbres.setRoot(rootItem);
listerbres.setVisible(true);
}
我想我知道addEventHandler是用于不同事件的,所以我不知道如何在对象“Item”上使用KeyListener

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

事先谢谢。(对我的英语不好表示歉意)。

如(在“TreeItem事件”下)所述:

但是需要注意的是,TreeItem不是节点,它是 意味着只传递TreeItem中定义的事件类型。 要收听一般事件(例如鼠标交互),它是 需要将必要的侦听器添加到包含在 树视图(通过提供一个单元工厂)

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

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 tree=;
tree.setonkey按下(e->{
TreeItem selected=tree.getSelectionModel().getSelectedItem();
if(选中!=null&&e.getCode()==KeyCode.DELETE){
System.out.println(“按Delete键+selected.getValue());
//删除与所选.getValue()关联的文件。。。
}
});
还有几点需要注意:

  • 键类型的事件没有与其关联的代码()。这里需要的是按键事件,而不是按键类型的事件
  • 由于您的树视图似乎正在显示文件,因此使用
    TreeView
    并修改单元格实现中的
    updateItem
    方法来显示文件名可能(更有意义)。然后,您可以使用侦听器中的
    getItem()
    直接获取该文件,删除该文件的代码将更加容易

  • 我没有使用Cell类,但是按下setOnKeyPressed时,我有一个响应:)非常感谢您的快速回答James\D
    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()...
        }
    });