2

在我正在编写的程序中,我有一个 JTree 存储我自己设计的一些对象。我自己扩展了 DefaultTreeCellRenderer 并覆盖了 getTreeCellRendererComponent 以返回带有一些按钮和东西的 JPanel。我发现我添加的按钮不像按钮,这让人认为与组件的交互被树单元“窃取”了。(如果单击按钮,按钮周围的容器也会被单击,并且树对被单击有自己的响应。)

所以我的问题是:

如果我想要的是树的基本功能,加上一些按钮,我应该使用什么方法?

  • 继续沿同一路线行驶;添加某种鼠标侦听器以手动将功能添加到按钮。
  • 继续沿同一路线行驶;删除现有的鼠标侦听器并添加您自己的以实现正确的行为。
  • 扩展或实现与您所做的稍有不同的类或接口 - 可能不是 DefaultMutableTreeNodes,也可能不是 DefaultTreeCellRenderer 等 - 使用现有的 XXXX 来做您想做的事情。
  • 避免使用 JTree;自己做,没那么难。

我倾向于最后一个选项——我很有可能实际上并不想要树的折叠行为,所以我可能只是制作自己的结构。但是,即使我选择了那个选项,我也想知道我应该做什么。

4

2 回答 2

4

您还需要一个TreeCellEditor,此处说明。

于 2012-07-25T01:45:00.333 回答
3

避免使用 JTree;自己做,没那么难

我祝你好运;-)

正在发生的是渲染器返回的组件仅用作“标记”。所以JTree并不真正包含返回的组件,它们只是被绘制。因此没有与您的按钮交互。它只是看起来像一个按钮。似乎本JTree教程不包含关于此的实际部分,但它与表的概念基本相同,本教程的“渲染器和编辑器”部分对此进行了解释。

这也解释了为什么一个典型的渲染器类可以扩展JLabel并且可以return this在对其自身进行自定义后简单地使用,而不会影响树中的其他节点。例如DefaultTreeCellRenderer,扩展的源代码JLabel包含

public Component getTreeCellRendererComponent(JTree tree, Object value,
                                              boolean sel,
                                              boolean expanded,
                                              boolean leaf, int row,
                                              boolean hasFocus) {
   //...
   setText(stringValue);
   //...
   return this;
}

如何解决这个问题:按照@trashgod 的建议创建一个编辑器

于 2012-07-25T06:01:25.790 回答