JTree,始终以“编辑模式”显示所有节点

时间:2012-03-07 15:16:39

标签: java swing jtree

我正在显示自定义对象树,并且我已设置自定义CellTreeEditorCellTreeRenderer

现在我真正想要的是始终以“编辑模式”显示所有对象。现在我的CellTreeRenderer.getTreeCellRendererComponent()CellTreeEditor.getTreeCellEditorComponent()几乎完全相同。这种工作,但我仍然需要点击一个节点来集中它,然后才能进行任何编辑。

有没有更明智的方法可以做到这一点,也许就像说永远不应该使用渲染器,默认为CellTreeEditor

****** **** UPDATE

要澄清:我所拥有的是一棵看起来像这样的树(是的,它看起来像垃圾,但这不是重点):

JTree showing renderer and editor components

现在,我通过让渲染器和编辑器从getTreeCell[Renderer|Editor]Component()返回相同的组件来实现此目的。

如果我单击渲染器提供的ComboBox上的向下箭头,它会在打开下拉列表时略微闪烁,但会被我的编辑器组件中断并替换。这意味着我必须再次单击它才能打开下拉列表。这是我想避免的行为。

1 个答案:

答案 0 :(得分:4)

扩展我的评论:不,你不想让你的编辑器在单元格之间共享(讨厌的东西开始发生)相反,添加一个TreeCellListener来监听lead(aka:focused)选择路径中的变化然后显式开始在该路径上进行编辑

    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中以确保树的内部更新完成