2

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

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

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

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

4

2 回答 2

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);
于 2010-09-18T23:05:18.187 回答
2

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

于 2010-09-18T14:27:34.777 回答