単純なテキストセルで動作するCellTreeがあります。ここで、ツリーノードごとに、葉であるかどうかに応じて異なる種類のセルが必要です。
このセルは次のようになります。
(1)ノードがリーフの場合(子がない場合):TextCell
(2)ノードがルートの場合(> =子があります):。-リーフと同じ文字列を表示する必要があります-+1クリック可能な画像(これはノードの名前の名前を変更するために使用されるアイコンです)。-+ 1つのクリック可能な画像(これはノードを削除するために使用されるアイコンです)。
私は試しました:
(1)AbstractCellを拡張するカスタムセル。ここでのポイントは、クリック可能な画像をマウスクリックに応答させることができないということです。したがって、アクションを実行することはできません(名前の編集またはノードの削除)。
(2)CompositeCell。ここでのポイントは、マウスクリックで応答するクリック可能な画像を取得したとしても、表示する必要のあるセルの種類を正しく選択する実装を取得できないことです(子があるかどうかに基づいて、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();
}