JTree, всегда отображать все узлы в «режиме редактирования» - PullRequest
2 голосов
/ 07 марта 2012

Я отображаю дерево пользовательских объектов, и у меня есть пользовательские наборы CellTreeEditor и CellTreeRenderer.

Теперь я действительно хочу всегда отображать все объекты, как в "edit"Режим".Прямо сейчас у меня CellTreeRenderer.getTreeCellRendererComponent() и CellTreeEditor.getTreeCellEditorComponent() реализованы почти одинаково.Это работает, но мне все еще нужно щелкнуть узел, чтобы сфокусировать его, прежде чем я смогу выполнить какое-либо редактирование.

Есть ли более разумный способ сделать это, например, сказать, что средство рендеринга никогда не должно использоваться, по умолчаниюна мой CellTreeEditor?

****** ОБНОВЛЕНИЕ ****

Чтобы прояснить: у меня есть дерево, похожее на это (и да, оно также выглядит как дерьмо, но это не относится к делу):

JTree showing renderer and editor components

Прямо сейчас я выполняю это, имея рендер и редактор, который возвращает идентичные компоненты из getTreeCell[Renderer|Editor]Component().

Если я нажму на стрелку вниз на ComboBox, предоставленном средством визуализации, он будет слегка мигать, когда откроет раскрывающийся список, но затем будет прерван и заменен моим компонентом редактора.Это означает, что я должен щелкнуть по нему еще раз, чтобы открыть раскрывающийся список.Это поведение, которое я хочу избежать.

1 Ответ

4 голосов
/ 07 марта 2012

Расширение моего комментария: нет, вы не хотите, чтобы ваш редактор разделялся между ячейками (неприятные вещи начинают происходить). Вместо этого, добавьте TreeCellListener, который прослушивает изменения в пути выбора лидера (он же: сфокусированный), а затем явно начать редактирование по этому пути

    final JXTree tree = new JXTree();
    tree.setEditable(true);
    tree.expandAll();
    TreeSelectionListener l = new TreeSelectionListener() {

        @Override
        public void valueChanged(TreeSelectionEvent e) {
            final TreePath path = e.getNewLeadSelectionPath();
            if (path != null) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        tree.startEditingAtPath(path);
                    }
                });
            }
        }

    };
    tree.addTreeSelectionListener(l);

Уловка, чтобы действительно заставить это работать, является обычной: обернуть пользовательскую реакцию в invokeLater, чтобы убедиться, что внутреннее обновление дерева завершено

...