猿问

从CellEditorListener获取Edited TreeNode

之前我曾问过在重命名TreeNode时如何触发事件(这里)。我的问题得到了回答,但我遇到了另一个问题。我需要在CellEditorListener的editingStopped事件中访问正在编辑的TreeNode。这是我必须这样做的代码:


package com.gamecreator;


import javax.swing.event.CellEditorListener;

import javax.swing.event.ChangeEvent;

import javax.swing.tree.DefaultTreeCellEditor;


public class CustomCellEditorListener implements CellEditorListener {

    public CustomCellEditorListener() {


    }


    public void editingCanceled(ChangeEvent e) {


    }


    public void editingStopped(ChangeEvent e) {

        DefaultTreeCellEditor editor = (DefaultTreeCellEditor) e.getSource(); //This gives me the error.

        CustomTreeNode node = //What do I put here???;

        node.getResource().setName((String) node.getUserObject());


        //For debugging

        System.out.println(node.getResource().getName());

    }

}

我收到此错误:


线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:javax.swing.tree.DefaultTreeCellEditor $ 1无法强制转换为javax.swing.tree.DefaultTreeCellEditor


编辑:在另一次尝试中,我在CustomCellEditorListener中使用了此代码


public void editingStopped(ChangeEvent e) {

    TreePath path = ((CustomTreeCellEditor) e.getSource()).getLastPath();  //This gives me the error.

    CustomTreeNode node = (CustomTreeNode) path.getLastPathComponent();

    node.getResource().setName((String) node.getUserObject());


    //For debugging

    System.out.println(node.getResource().getName());

}

以及CustomTreeCellEditor中的此代码


public TreePath getLastPath() {

    return lastPath;

}

我得到了同样的错误(我希望我会)。我所拥有的应该是有用的,所以剩下的唯一真正的问题是,“我为什么会得到这个错误,我该如何修复它?”但如果有人有更好的方法来实现这个目标,我愿意倾听。

ibeautiful
浏览 620回答 3
3回答

桃花长相依

我找到了一个非常简单的解决方案。重命名TreeNode时,它最终成为树中唯一选定的节点。因此,我能够使用:    CustomTreeNode node = (CustomTreeNode) tree.getLastSelectedPathComponent();

慕后森

我敢说这不是很理想吗?如果你的JTree选择模型混淆多重选择怎么办,那么重命名不会取消其他选择?或者如果您以某种方式更改了JTree,那么您可以在不选择的情况下进行编辑?我建议一种方法是继承DefaultTreeCellEditor(DTCE),在构造函数中添加CellEditorListener,覆盖getTreeCellEditorComponent,然后通过编辑到字段中生成必须保留的任何数据。DTCE中一个有用的(受保护的)字段是“lastRow”...您可以从editStopped内部访问它以返回到您的节点,在大多数情况下。
随时随地看视频慕课网APP
我要回答