【问题标题】:How to add KeyListener on a TreeItem JavaFX?如何在 TreeItem JavaFX 上添加 KeyListener?
【发布时间】:2016-04-19 21:37:13
【问题描述】:

我有一个带有 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 是针对不同事件的,所以我不明白如何在对象“项目”上使用 KeyListener。

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

先谢谢你。(对不起我的英语不好)。

【问题讨论】:

    标签: java javafx treeview keylistener


    【解决方案1】:

    TreeItem documentation 中所述(在“TreeItem Events”下):

    需要注意的是,TreeItem 不是节点,它 表示仅传递 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&lt;File&gt; 并在单元实现中修改updateItem 方法以显示文件名可能更有意义。然后就可以在监听器中直接用getItem()获取文件了,删除它的代码会容易很多。

    【讨论】:

    • 我没有使用 Cell 类,但是使用 setOnKeyPressed 我按下键时有响应 :) 非常感谢您的快速回答 James_D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多