0

我有一个使用简单文本单元格的 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();

}

4

1 回答 1

0

单元格不依赖于它将显示的值,而是依赖于节点的值。

因此,您需要一个支持渲染/行为的通用单元格,并根据要求显示的值在它们之间切换:对于您可以判断为叶子的值,然后仅渲染文本,否则也渲染图像/按钮(请注意,您也可以渲染相同的 HTML 以使使用 a 成为可能/更容易CompositeCell- 但使用 CSS 切换图像/按钮的可见性(class=xxx在容器元素上渲染)。

于 2013-01-29T13:30:08.700 回答