之前我曾问过在重命名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;}我得到了同样的错误(我希望我会)。我所拥有的应该是有用的,所以剩下的唯一真正的问题是,“我为什么会得到这个错误,我该如何修复它?”但如果有人有更好的方法来实现这个目标,我愿意倾听。
3 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
我找到了一个非常简单的解决方案。重命名TreeNode时,它最终成为树中唯一选定的节点。因此,我能够使用:
CustomTreeNode node = (CustomTreeNode) tree.getLastSelectedPathComponent();
慕后森
TA贡献1802条经验 获得超5个赞
我敢说这不是很理想吗?如果你的JTree选择模型混淆多重选择怎么办,那么重命名不会取消其他选择?或者如果您以某种方式更改了JTree,那么您可以在不选择的情况下进行编辑?我建议一种方法是继承DefaultTreeCellEditor(DTCE),在构造函数中添加CellEditorListener,覆盖getTreeCellEditorComponent,然后通过编辑到字段中生成必须保留的任何数据。DTCE中一个有用的(受保护的)字段是“lastRow”...您可以从editStopped内部访问它以返回到您的节点,在大多数情况下。
添加回答
举报
0/150
提交
取消