我有一个使用简单文本单元格的CellTree。 现在,对于每个树节点,我想要一种不同类型的单元格,具体取决于它是否为叶子。
这个单元格将是:
(1)如果节点是叶子(没有子节点):TextCell
(2)如果节点是根(它具有> = children): - 它必须显示与叶子相同的字符串 - + 1可点击图像(这是用于重命名节点名称的图标)。 - + 1可点击图像(这是用于删除节点的图标)。
我试过了:
(1)自定义单元格,扩展AbstractCell。这里的要点是我无法让可点击的图像响应鼠标点击。因此,无法执行任何操作(编辑名称或删除节点)。
(2)CompositeCell。这里的要点是altought我得到可点击的图像在鼠标点击响应,我无法得到一个实现正确选择必须显示哪种类型的细胞(基于它是否有孩子,显示TetxCell或带图标的自定义单元格)。
有人可以解释我是如何实现这一目标的吗?到目前为止我的代码是:
public NodeInfo getNodeInfo(T value){
if (value == null) {
return new DefaultNodeInfo<CellTreeNode>(treeData.getDataProvider(), new IconCell(!isLeaf(value)),
selectionModel, null);
}
else if (value instanceof CellTreeNode) {
CellTreeNode node = (CellTreeNode) value;
//data provider for this cell
ListDataProvider<CellTreeNode> nodeDataProvider = new ListDataProvider<CellTreeNode>(node.getChildren());
IconCell nodeCell = new IconCell(this, node, !isLeaf(node));
// add a reference to the visual representation of the element
node.setCell(nodeCell);
return new DefaultNodeInfo<CellTreeNode>(nodeDataProvider, nodeCell,
selectionModel, null);
}
// Unhandled type.
String type = value.getClass().getName();
throw new IllegalArgumentException(
"[CellLargeTreeListBox] Unsupported object type: " + type);
}
//检查指定的值是否表示叶节点。叶节点不能 //打开 public boolean isLeaf(Object value) {
if (value == null) return false;
CellTreeNode node = (CellTreeNode) value;
return value instanceof CellTreeNode && !node.isRoot();
}
答案 0 :(得分:0)
单元格不依赖于它显示的值,而是取决于父节点的值。
因此,您需要一个支持渲染/行为的通用单元格,并根据要求显示的值在它们之间切换:对于您可以告诉的值是叶子,然后只渲染文本,否则也渲染图像/按钮(注意您也可以呈现相同的HTML - 使其更容易/更容易使用CompositeCell
- 但使用CSS(class=xxx
在容器元素上呈现切换图像/按钮的可见性)。