TreeSDMModel2 クラス

ダイアグラム・コンポーネントでツリーのデータ・モデルを表示するには、ツリー・データを 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];
  }