我正在尝试创建一个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
答案 0 :(得分:3)
您忘记通过JTree
或JTree.cancelEditing()
告诉JTree.stopEditing()
编辑会话已结束。其次,您应该只在编辑会话中显示JComboBox
。使用普通JLabel
进行当前选择的标准渲染。我不会给你代码,因为你的例子太冗长了,实际上没有表明我的观点。
编辑:此外,我想指出,使用相同的组件进行编辑和渲染是一个非常糟糕的主意。让我们考虑一下。
JComboBox
会在下面的节点上方打开。JTree
会显示所描述的问题。如果您将TreeCellRenderer
与TreeCellEditor
分开,最后会更好。
答案 1 :(得分:2)
RendererDispatcher rendererDispatcher = new RendererDispatcher(tree);
RendererDispatcher editorDispatcher = new RendererDispatcher(tree);
tree.setCellRenderer(rendererDispatcher);
tree.setCellEditor(editorDispatcher);