Swing 如何修改TreeCeleditor(Java)的默认编辑行为

Swing 如何修改TreeCeleditor(Java)的默认编辑行为,swing,jtree,java,Swing,Jtree,Java,我有一个自定义对象,它有一个描述(字符串)和优先级值(int)。我在JTree中显示这些值,因为这种类型的不同对象之间存在层次关系。我只在JTree节点中显示描述,因为优先级对于显示目的并不重要 当我编辑JTree节点(叶子或节点)时,我希望有一个JDialog弹出窗口——例如按F2键。然后,此对话框将用于编辑说明和优先级 如何防止JTree将文本作为文本字段执行默认编辑,并调用自定义对话框 我认为一种简单的方法是对DefaultTreeCellEditor类进行子类化,并重写isCellEdi

我有一个自定义对象,它有一个描述(字符串)和优先级值(int)。我在JTree中显示这些值,因为这种类型的不同对象之间存在层次关系。我只在JTree节点中显示描述,因为优先级对于显示目的并不重要

当我编辑JTree节点(叶子或节点)时,我希望有一个JDialog弹出窗口——例如按F2键。然后,此对话框将用于编辑说明和优先级

如何防止JTree将文本作为文本字段执行默认编辑,并调用自定义对话框


我认为一种简单的方法是对DefaultTreeCellEditor类进行子类化,并重写isCellEditable方法。然后,我将调用J对话框(在我实例化自定义Debug TeCeCeleLeNebug)时,可以获得相关的初始化元素,并且只返回false以防止默认编辑——但是对我来说这似乎不够优雅。进一步讨论。

我认为F2可以在树节点上工作,因为您调用了
JTree#setEditable(true)

绑定安装在
basictreui#installKeyboardActions
中。您可以按照通常的方式安装自己的绑定:

JTree tree = new JTree(new String[]{"a", "b", "c"});
tree.setEditable(true);
InputMap m = tree.getInputMap(JComponent.WHEN_FOCUSED);
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
m.put(ks, "actionMapKey");
tree.getActionMap().put("actionMapKey", new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        // do your stuff
    }
});
JComponent。当在聚焦窗口中时,通常优于
JComponent。当聚焦时,但基本用户界面使用后者

如果要使用不同的键,删除F2绑定有点棘手,因为它位于父输入映射中:

m.remove(ks);
if( m.getParent() != null )
    m.getParent().remove(ks);

我喜欢我所看到的。这与GTK+制作TreeView组件的方式非常相似。这样-您可以查看所有相关数据并对其进行编辑。在我的问题中显示优先级是没有必要的,但不会影响解决方案。我会进一步调查的,谢谢。