我一直在调查JTree和TreeCellRenderer。一般来说,应用程序(有一个JTree)只有一个TreeCellRenderer实例。应用程序对TreeCellRenderer的getTreeCellRendererComponent方法进行多次调用,以决定如何绘制每个TreeCell,并且在许多情况下(当单元格被选中、取消选择、移动、滚动等等时)都会进行这样的调用。为什么他们决定这样做,而不是拥有多个TreeCellRenderer实例,每个实例负责一个单元?
我正在尝试创建一个JTree,其中每个单元格都包含一个复选框。用户可以选中/不选中该复选框。然后,根据这些复选框的状态设置TreeNode userObject的值。但是,从当前的JTree设计来看,这是不可能的--因为只有一个JCheckBox实例,并且只用于显示单元格的外观(您不能真正检查它)。在某种意义上,我希望将TreeCell的选择和复选框分开。
我有一些解决办法(实现MouseAdapter并检查鼠标单击是否在复选框呈现的位置关闭,然后通过更改复选框在TreeCellRenderer中的外观来模拟复选框),但我仍然想知道是否可以更直接地完成这一任务。谢谢!
发布于 2010-07-08 05:45:25
为什么他们决定这样做,而不是拥有多个TreeCellRenderer实例,每个实例负责一个单元?
这是http://en.wikipedia.org/wiki/Flyweight_pattern的一个很好的例子。
对于复选框树,我喜欢org.netbeans.swing.outline.Outline,提到了这里,但其他示例是可用的。
增编:仔细阅读你的问题,你会问:
在某种意义上,我希望将TreeCell的选择和复选框分开。
这是正确的本能:数据(检查或未检查)应该存储在模型(TreeModel)中,而不是视图(JCheckBox)中。因此,示例在它的(隐式)模型中使用了CheckBoxNode的实例。
https://stackoverflow.com/questions/3200826
复制相似问题