【问题标题】:JTree, always display all nodes in "edit mode"JTree,始终以“编辑模式”显示所有节点
【发布时间】:2012-03-07 15:16:38
【问题描述】:

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

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

有没有更明智的做法,比如说不应该使用任何渲染器,默认为我的CellTreeEditor

******更新****

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

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

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

【问题讨论】:

  • 不,你不想让你的编辑器在单元格之间共享(讨厌的事情开始发生)相反,添加一个 TreeCellListener 来监听线索(又名:聚焦)选择路径中的变化,然后在该路径上明确开始编辑
  • 暂时忘记闪烁(这可能是由于渲染器与编辑器的轻微对齐错误)您基本上必须抓住启动编辑器的 mouseEvent,检查它是否在按钮内,如果因此,一旦将编辑器添加到层次结构中,就以编程方式显示下拉列表 - 说起来容易做起来难,我知道 :) 显示一个包含您的自定义渲染器/编辑器的 sscce 怎么样,以便我们尝试把它放在那里?

标签: java swing jtree


【解决方案1】:

扩展我的评论:不,您不想让您的编辑器在单元格之间共享(讨厌的事情开始发生)相反,添加一个 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 以确保树的内部更新是完整的

【讨论】:

  • 请原谅我的愚蠢问题。但是:当我单击一个节点时,我的节点会自动进入编辑模式,而我除了在其上设置自定义 CellEditor 之外没有做任何其他事情。这应该带来什么附加价值?
  • ehh ...您不必在节点上单击 ...?也许我误解了您的问题,请详细说明您想要实现的具体目标(而不是解决方案可能遇到的问题:-)
  • 我只是问,因为我假设我太 stoopid 无法理解您的答案。它可能很巧妙,正是我所需要的。 8)无论如何,现在更新问题。希望这能让它更清楚!
猜你喜欢
  • 2016-07-22
  • 2011-11-12
  • 1970-01-01
  • 2013-02-11
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多