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

时间:2010-09-18 12:11:45

标签: swing jtree java

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

我想在编辑JTree节点(叶子或节点)时弹出一个JDialog - 例如按F2。然后,此对话框将用于编辑两者描述和优先级。

如何阻止JTree将文本默认编辑为文本字段并调用自定义对话框?

我认为一种简单的方法是继承DefaultTreeCellEditor类并覆盖isCellEditable方法。然后,我会在那里调用JDialog(我可以在实例化自定义DefaultTreeCellEditor时获取相关的初始化元素)并简单地返回false以防止默认编辑 - 但这对我来说似乎不够优雅。

2 个答案:

答案 0 :(得分:2)

作为替代方案,请考虑org.netbeans.swing.outline.Outline,进一步讨论here

答案 1 :(得分:2)

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

F2绑定安装在BasicTreeUI#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.WHEN_IN_FOCUSED_WINDOW通常优于JComponent.WHEN_FOCUSED,但BasicTreeUI使用后者。

如果你想使用不同的密钥,删除父绑定中的F2绑定有点棘手:

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