我有一个使用简单文本单元格的 CellTree。现在,对于每个树节点,我想要一种不同类型的单元格,具体取决于它是否是叶子。
该单元格将是:
(1) 如果节点是叶子(没有子节点):TextCell
(2) 如果节点是根节点(它有 >= 子节点):。- 它必须显示与叶子相同的字符串 - + 1 个可点击的图像(这是一个用于重命名节点名称的图标)。- + 1 个可点击的图像(这是一个用于删除节点的图标)。
我试过:
(1) 自定义单元格,扩展 AbstractCell。这里的重点是我无法让可点击的图像响应鼠标点击。因此无法执行任何操作(编辑名称或删除节点)。
(2) 复合单元。这里的重点是虽然我得到了可点击的图像以响应鼠标点击,但我无法获得正确选择必须显示哪种单元格的实现(基于它是否有子单元,显示 TetxCell 或带有图标的自定义单元格)。
有人可以解释我如何做到这一点吗?到目前为止,我的代码是:
公共节点信息 getNodeInfo(T 值) {
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);
}
// 检查指定的值是否代表叶节点。叶节点不能 // 打开。公共布尔isLeaf(对象值){
if (value == null) return false;
CellTreeNode node = (CellTreeNode) value;
return value instanceof CellTreeNode && !node.isRoot();
}