如何设置JTree始终使用其单元格编辑器进行显示?

时间:2013-02-26 17:21:07

标签: java swing jtree

我有一个JTree

JTree tree = new JTree();
tree.setCellRenderer(// ...);
tree.setCellEditor(// ...);
tree.setEditable(true);

使用其单元格渲染器显示其单元格;如果单击单元格,则使用单元格编辑器显示。有没有一种方法可以使用单元格编辑器显示?

  1. 我试图删除渲染器。这不起作用,因为JTree转向其默认的单元格渲染器。
  2. 这类似于this question,但是,这个问题似乎没有包含与我的具体问题相关的答案。

2 个答案:

答案 0 :(得分:1)

最简单的方法是创建一个返回相关TreeCellEditor组件的TreeCellRenderer。

尝试这样的事情:

        tree.setCellRenderer(new TreeCellRenderer() {
        @Override
        public Component getTreeCellRendererComponent(
                JTree tree, Object value, 
                boolean selected, boolean expanded,
                boolean leaf, int row, boolean hasFocus) {
            return tree.getCellEditor().getTreeCellEditorComponent(tree, value, 
                                                      selected, expanded, leaf, row);
        }

    });

答案 1 :(得分:0)

单元格编辑器和渲染器的问题在于,应该重新使用一个GUI组件来绘制列表(渲染器)中的每个元素,并且一次只能编辑一行(编辑器)。如果您破坏了单个GUI组件规则,Swing GUI可能会出现笨拙,缓慢甚至完全中断的行为。

换句话说,对于单元格渲染器使用编辑组件(如dropdiwn),您将遇到问题,因为每个列表的元素都应使用相同的JComboBox。如果为每个树元素创建不同的渲染器对象,则会遇到内存问题和其他异常行为

如果你真的想使用渲染器的下拉列表,你可以自己实现一个TreeCellRenderer,在调用public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)时返回一个唯一的JComboBox实例。