ダイアグラム・コンポーネントでツリーのデータ・モデルを表示するには、ツリー・データを SDM モデル に変換するデータ・モデルを作成する必要があります。この例では、以下のコード例で示すように、モデルは、 IlvBasicSDMModel のサブクラスによって実装されます。
public class TreeSDMModel2 extends IlvBasicSDMModel { ...
この SDM モデルは、グラフのノードを表す新規クラスを実装する代わりに、JTree モデルから直接取得したツリー・ノードを使用します。
この方法には、ノードごとのオブジェクト割り振りを省くという利点があります。
ただし、JTree モデルには親子関係を表すオブジェクトがないため、リンク用には新しいクラスが必要です。
ツリー・モデルへの参照
TreeSDMModel2
クラスは、以下のコード例で示すように、ツリー・モデルへの参照を保持しています。
private TreeModel treeModel; private ArrayList links = new ArrayList(); public TreeSDMModel2(TreeModel treeModel) { this.treeModel = treeModel; createLinks(treeModel.getRoot()); }
リンク作成用のメソッド
以下のコード例で示すように、
createLinks
メソッドは、親子リンクを作成し、それらをリストの形で保管します。
private void createLinks(Object treeNode) { for(int i = 0; i < treeModel.getChildCount(treeNode); i++){ Object childNode = treeModel.getChild(treeNode, i); links.add(new TreeLink(treeNode, childNode)); createLinks(childNode); } }
すべてのノードおよびリンクを取得するメソッド
getObjects
メソッド (以下のコード例参照) は、ツリーのすべてのノードを再帰的に返し、コンストラクターで作成されたリンクも返します。
このバリアントでは、データ・モデルはフラットです。つまり、ツリー階層がサブグラフに変換されないため、すべてのノードおよびリンクが SDM モデル内で同じレベルになります。
ノードとリンクの取得
public Enumeration getObjects() { Vector v = new Vector(); getTreeNodes(treeModel.getRoot(), v); for (int i = 0; i < links.size(); i++) { v.addElement(links.get(i)); } return v.elements(); } private void getTreeNodes(Object parentNode, Vector v) { v.addElement(parentNode); for(int i = 0; i < treeModel.getChildCount(parentNode); i++){ getTreeNodes(treeModel.getChild(parentNode, i), v); } }
SDM モデル・インターフェースのメソッド
SDM モデル・インターフェースのメソッドは、ノード・クラスやリンク・クラスに実装されるのではなく、
IlvBasicSDMModel のサブクラスに直接実装されます。以下のコード例を参照してください。
SDM モデル・インターフェースの実装
public String getTag(Object obj) { if(isLink(obj)) return "treelink"; else return "treenode"; } public boolean isLink(Object obj) { return obj instanceof TreeLink; } public Object getFrom(Object link) { return ((TreeLink)link).getParentNode(); } public Object getTo(Object link) { return ((TreeLink)link).getChildNode(); } public Object getObjectProperty(Object object, String property) { if(object instanceof DefaultMutableTreeNode){ if(property.equals("userObject")){ return ((DefaultMutableTreeNode)object).getUserObject(); } if(property.equals("CSSclass") && ((DefaultMutableTreeNode)object).getParent() != null){ return ((DefaultMutableTreeNode)((DefaultMutableTreeNode)object). getParent()).getUserObject(); } } return null; } public String[] getObjectPropertyNames(Object object) { if(object instanceof DefaultMutableTreeNode) return new String[] { "userObject", "CSSclass" }; else return new String[0]; }