Как изменить стандартное поведение редактирования TreeCellEditor (Java) - PullRequest
2 голосов
/ 18 сентября 2010

У меня есть пользовательский объект, который имеет описание (String) и значение приоритета (int). Я отображаю эти значения в JTree, потому что между различными объектами этого типа существуют иерархические отношения. Я только отображаю описание в узлах JTree, потому что приоритет не важен для целей отображения.

Я хотел бы иметь всплывающее окно JDialog, когда я редактирую узел JTree (лист или узел) - например, нажав F2. Затем этот диалог будет использоваться для редактирования и описания и приоритета.

Как запретить JTree выполнять редактирование текста по умолчанию в виде текстового поля и вместо этого вызывать пользовательский диалог?

Я полагаю, что простым способом было бы создать подкласс класса DefaultTreeCellEditor и переопределить метод isCellEditable. Затем я бы вызвал JDialog там (я могу получить соответствующие элементы инициализации, когда я создаю экземпляр пользовательского DefaultTreeCellEditor) и просто возвращаю false, чтобы предотвратить редактирование по умолчанию - но это мне не кажется достаточно элегантным.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2010

Полагаю, 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);
2 голосов
/ 18 сентября 2010

В качестве альтернативы рассмотрим org.netbeans.swing.outline.Outline, обсуждается далее здесь .

...