JTree节点渲染器中的多个组件&节点编辑器

时间:2010-03-29 17:34:41

标签: java swing jtree

我正在尝试创建一个JTree,其中一个节点有几个组件:一个JPanel,它包含一个JCheckBox,后面是一个JLabel,然后是一个JComboBox。如果有人希望运行它,我已将代码附加在底部。幸运的是,JTree正确呈现了组件。但是当我点击JComboBox时,节点就会消失;如果我点击JCheckBox,它工作正常。我似乎在设置TreeCellEditor的方式上做错了。我该如何解决这个问题?我是否超越了JTree的能力?

以下是我在下面发布的代码的快速概述。

  • EntityListDialog仅创建用户界面。除了createTree方法之外,了解它是没有用的。
  • Node是保存有关JTree中每个节点的信息的数据结构。所有Node都有name,但samples可能为null或空数组。通过查看EntityListDialog的{​​{1}}方法,这一点应该很明显。 createTree用作JCheckBox的文本。如果name非空,则将其用作JCheckBox的内容。
  • samples呈现NodeWithSamplesRenderer非空的Node个。它使用由JCheckBox和JComboBox组成的JPanel创建复杂的用户界面。
  • sample为空时,
  • NodeWithoutSamplesRenderer只创建一个JCheckBox。
  • samples决定是使用RendererDispatcher还是NodeWithSamplesRenderer。这完全取决于NodeWithoutSamplesRenderer是否具有非空Node成员。它本质上可以作为samples * NodeWith插入JTree的手段。

代码清单:

SamplesRenderer

2 个答案:

答案 0 :(得分:3)

您忘记通过JTreeJTree.cancelEditing()告诉JTree.stopEditing()编辑会话已结束。其次,您应该只在编辑会话中显示JComboBox。使用普通JLabel进行当前选择的标准渲染。我不会给你代码,因为你的例子太冗长了,实际上没有表明我的观点。

编辑:此外,我想指出,使用相同的组件进行编辑和渲染是一个非常糟糕的主意。让我们考虑一下。

  1. 您开始编辑节点。
  2. JComboBox会在下面的节点上方打开。
  3. 以下节点必须重新渲染。
  4. 现在将使用当前用于编辑的完全相同的对象进行渲染。
  5. 您的JTree会显示所描述的问题。
  6. 如果您将TreeCellRendererTreeCellEditor分开,最后会更好。

答案 1 :(得分:2)

RendererDispatcher rendererDispatcher = new RendererDispatcher(tree);
RendererDispatcher editorDispatcher = new RendererDispatcher(tree);
tree.setCellRenderer(rendererDispatcher);
tree.setCellEditor(editorDispatcher);