TreeViewというウィジェットはJavaFXに限らず、制御が面倒です。TreeViewを操作するユーザにとっては、アイテムの編集、アイテムのDrag and Dropによるコピーや移動、アイテムの追加/削除などの機能は、ごく当たり前です。しかし、もともとTreeViewにはこれらの機能が備わっていないため、プログラマが自前でゴリゴリ作る必要があるのです。
TreeViewは、大きく4つの部品で構成します。GUI部品としてのTreeViewとTreeCell、モデルとしてのTreeItemとそのデータです。複数個のTreeItemを親子関係になるようにつなぎ合わせることにより、木構造を表現します。
TreeItemのルート(一番上の親)をTreeViewに渡すと、その木構造に合わせてTreeView上にTreeCellが貼り付けられます。個々のTreeItemにはデータがあり、そのデータのtoString()が返す文字列がTreeCell上でラベルとして表示されます。つまり、TreeCell、TreeItem、データは、1対1対1の関係にあります。
今回はTreeItemに紐付ける汎用的なデータとして、TreeItemDataクラスを作ります。
package jfxtreeview;
/**
*{@link javafx.scene.control.TreeItem}用のデータです。
*/
public class TreeItemData {
private final String name; //名前
private final Type type; //種類(グループ/アイテム)
/**
*コンストラクタです。
*@param name 名前
*/
public TreeItemData(String name) {
this(name, Type.ITEM);
}
/**
*コンストラクタです。
*@param name 名前
*@param type 種類
*/
public TreeItemData(String name, Type type) {
this.name = name;
this.type = type;
}
/**
*名前を取得します。
*@return 名前
*/
public String getName(){
return this.name;
}
/**
*種類を取得します。
*@return 種類
*/
public Type getType(){
return this.type;
}
/**
*文字列表現を返します。
*{@link #getName()}と同じ文字列を返します。
*@see #getName()
*/
@Override
public String toString(){
return this.getName();
}
/**
*TreeItemの種類です。
*/
public enum Type {
/**グループです。*/
GROUP,
/**アイテムです。*/
ITEM,
}
}
TreeItemDataのプロパティは、「名前」と「種類」の2つだけです。また、内部クラスとしてenum型のTypeもあります。
TreeItemDataはtoString()が「名前」を返すようになっていて、それがTreeCell上でラベルとして表示されます。「種類」は、TreeCell上で「フォルダ」と「ファイル」のアイコンを表示させるためにあり、Type.GROUPまたはType.ITEMを指定します。GROUPなら「フォルダ」のアイコン、ITEMなら「ファイル」のアイコンが表示されるようにします。
このTreeItemDataを、TreeItemのsetValue()で設定したりgetValue()で取得したりするわけです。
今回はここまでです。次回はTreeCellについて触れる予定です。