Пользовательская ячейка в gwt CellTree

У меня есть CellTree, работающий с простыми текстовыми ячейками. Теперь я хочу, для каждого узла дерева, другого типа ячейки, в зависимости от того, является ли это листом или нет.

Этими ячейками были бы:

(1) если узел является листом (не имеет дочерних элементов): TextCell

(2) if the node is a root (it has >= children):. - It must display the same string as the leafs - + 1 clickable image (this is an icon that is used to rename the node's name). - + 1 clickable image (this is an icon that is used to remove the node).

Я пробовал:

(1) Пользовательская ячейка, расширяющая AbstractCell. Дело здесь в том, что я не могу заставить кликируемые изображения реагировать на щелчок мышью. Поэтому никакое действие не может быть выполнено (изменить имя или удалить узел).

(2) CompositeCell. Дело здесь в том, что, если бы я получил кликабельные изображения для ответа на mouseclick, я не могу получить реализацию, которая правильно выбирает, какую ячейку нужно отображать (на основе того, есть ли у нее дети или нет, показать TetxCell или пользовательскую ячейку со значками ).

Может ли кто-нибудь объяснить, как я могу это достичь? Мой код пока:

public NodeInfo getNodeInfo (значение T) {

if (value == null) {
  return new DefaultNodeInfo(treeData.getDataProvider(), new IconCell(!isLeaf(value)),
      selectionModel, null);
}
else if (value instanceof CellTreeNode) {
  CellTreeNode node = (CellTreeNode) value;

  //data provider for this cell
  ListDataProvider nodeDataProvider = new ListDataProvider(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(nodeDataProvider, nodeCell,
      selectionModel, null);
}
// Unhandled type.
String type = value.getClass().getName();
throw new IllegalArgumentException(
    "[CellLargeTreeListBox] Unsupported object type: " + type);

}

// Проверяем, соответствует ли указанное значение листовому узлу. Листовые узлы не могут быть   // открыт.   public boolean isLeaf (значение объекта)   {

if (value == null) return false;
CellTreeNode node = (CellTreeNode) value;
return value instanceof CellTreeNode && !node.isRoot();

}

0
nl ja de

1 ответы

Ячейка не будет зависеть от значения, которое будет отображаться, но о значении узла parent .

Таким образом, вам понадобится универсальная ячейка, которая поддерживает как рендеринг/поведение, так и переключатели между ними на основе значения, которое оно запрашивает для отображения: для значения, которое вы можете указать, является листом, а затем отображать только текст, в противном случае также отображать изображения/(обратите внимание, что вы также можете отобразить один и тот же HTML-код, чтобы сделать/проще использовать CompositeCell ), но переключить видимость изображений/кнопок с помощью CSS ( class = xxx отображаемый на элемент контейнера).

0
добавлено
Спасибо Томасу! наконец, я использую div с дисплеем: none для этих значков, которые я не хочу отображать. Я не пытался играть со стилями ... и был лучшим решением.
добавлено автор user2003308, источник