2016-09-30 13 views
0

NattableでtreeTableビューを作成する方法を探しています。私は既にフィルタ、ソート、実装されたNatTableを持っています...Nattableのツリービュー

今はNattableの例からTreeGridWithCheckBoxFieldsExampleのようなTreeTableを探しています。唯一の要件は、ツリーのデータモデルを変更しないことです。

私は2つの異なるオブジェクト会社と役割を持っています。すべての企業はすべての役割を担っています。ですから、このような状況では、すべての企業がルートオブジェクトとして、すべての企業の下にすべての役割を持つツリーが必要です。それはMVCの原則に違反しますので、(私はこれを行うことはありません、私はTreeList.Formatを実装形式のクラスを作成する必要があるが、彼らは親をリンクするためにモデルを使用しているように見えるの例から

は誰か私NatTableにツリーテーブルビューを作成するために軌道に乗る?

がNatableのいくつかの例を確認した後、私は作業のtreeTableを得たことができます。しかし、1つしか残って問題を抱えている。親項目が正しく表示されません。

treeFormatは次のようになります。

public class TreeFormat implements TreeList.Format<PermissionViewModel> { 

public TreeFormat() { 
} 

@Override 
public Comparator getComparator(int depth) {  
    return new Comparator<PermissionViewModel>() { 

     @Override 
     public int compare(PermissionViewModel object1, PermissionViewModel object2) { 

      return object1.getModuleName().compareTo(object2.getModuleName()); 

     } 
    }; 
} 

@Override 
public void getPath(List<PermissionViewModel> path, PermissionViewModel element) { 
    path.add(element); 
    PermissionViewModel parent = element.getParent(); 
     while (parent != null) { 
      path.add(parent); 
      parent = parent.getParent(); 
     } 
     Collections.reverse(path); 
} 

@Override 
public boolean allowsChildren(PermissionViewModel element) { 
    return true; 
} 

Iがビューモデルで使用して、次のソースで行われるツリーテーブルにデータを置く正常モデル

public class PermissionViewModel implements Comparable { 

    private PermissionViewModel parent; 
    private ArrayList<PermissionViewModel> children = new ArrayList(); 

    private Integer permissionId; 
    private String moduleName; 
    private String permissionName; 
    private boolean active; 
    private boolean on; 

    public PermissionViewModel(PermissionViewModel parent, Permission permission) { 
     this.parent = parent; 
     if (parent != null) { 
      parent.addChild(this); 
     } 

     if(parent == null && permission != null) 
     { 
      this.permissionId = 0; 
      this.moduleName = ""; 
      this.permissionName = permission.getModuleName(); 
      this.active = false;  
     }   
     else 
     { 
      this.permissionId = permission.getPermissionId(); 
      this.moduleName = permission.getModuleName(); 
      this.permissionName = permission.getPermissionName(); 
      this.active = permission.isActive(); 
     } 
    } 

    public PermissionViewModel getParent() { 
     return this.parent; 
    } 

    public void addChild(PermissionViewModel child) { 
     this.children.add(child); 
    } 

    public List getChildren() { 
     return this.children; 
    } 

    public PermissionViewModel getSelf() { 
     return this; 
    } 

    public boolean isOn() { 
     if (this.children.size() == 0) { 
      return this.on; 
     } else { 
      return getCheckBoxState() == CheckBoxStateEnum.CHECKED; 
     } 
    } 

    public void setOn(boolean on) { 
     if (this.children.size() == 0) { 
      this.on = on; 
     } else { 
      for (PermissionViewModel child : this.children) { 
       child.setOn(on); 
      } 
     } 
    } 


    public CheckBoxStateEnum getCheckBoxState() { 
     if (this.children.size() == 0) { 
      return this.on ? CheckBoxStateEnum.CHECKED 
        : CheckBoxStateEnum.UNCHECKED; 
     } else { 
      boolean atLeastOneChildChecked = false; 
      boolean atLeastOneChildUnchecked = false; 

      for (PermissionViewModel child : this.children) { 
       CheckBoxStateEnum childCheckBoxState = child.getCheckBoxState(); 
       switch (childCheckBoxState) { 
        case CHECKED: 
         atLeastOneChildChecked = true; 
         break; 
        case SEMICHECKED: 
         return CheckBoxStateEnum.SEMICHECKED; 
        case UNCHECKED: 
         atLeastOneChildUnchecked = true; 
         break; 
       } 
      } 

      if (atLeastOneChildChecked) { 
       if (atLeastOneChildUnchecked) { 
        return CheckBoxStateEnum.SEMICHECKED; 
       } else { 
        return CheckBoxStateEnum.CHECKED; 
       } 
      } else { 
       return CheckBoxStateEnum.UNCHECKED; 
      } 
     } 
    } 

    @Override 
    public int compareTo(Object o) { 
     return 0; 
    } 

    public Integer getPermissionId() { 
     return permissionId; 
    } 

    public String getModuleName() { 
     return moduleName; 
    } 

    public String getPermissionName() { 
     return permissionName; 
    } 

    public boolean isActive() { 
     return active; 
    } 

} 

に一対一のマップであるモデル:

ArrayList<PermissionViewModel> permissionViewModelsList = new ArrayList<>(); 
    String previousModule = ""; 
    PermissionViewModel currentParent = null; 

    for (Permission element : repo.getAllData()) { 

     if(!previousModule.equals(element.getModuleName())) 
     { 
      previousModule = element.getModuleName(); 

      currentParent = new PermissionViewModel(null, element); 
      permissionViewModelsList.add(currentParent); 

      permissionViewModelsList.add(new PermissionViewModel(currentParent, element)); 
     } 
     else 
     { 
      permissionViewModelsList.add(new PermissionViewModel(currentParent, element)); 
     } 

    } 
    Collections.reverse(permissionViewModelsList); 


    permissionTable.setItems(permissionViewModelsList); 
    permissionTable.refresh(true); 

しかし、私がテーブルを見ると、ルート要素が見えますが、ルート要素の子要素は間違っています。私は要素のリストを見ましたが、そこには何の問題も見つけられません。誰かが私が持っている問題を見つけることができますか?

enter image description here

+0

私はTreeList.FormatとMVCに関する懸念を理解していません。 NatTableはビューであり、TreeList.Formatはその一部です。モデルに関連するものを表示する必要があります。したがって、ビューの一部としてのTreeList.Formatは、ツリー構造を構築するためのモデルに依存しているとは限りません。あなたの懸念事項は何ですか?また、モデルから情報を取得せずに、データモデルからツリー構造を構築する方法はありますか? –

+0

状況によっては問題ありません。しかし私の状況では、役割は親(会社)について何も知る必要はありません。それ以外の場合は、すべての企業で同じロールを作成する必要があります(1つのロールはすべての企業に存在します)。 – JimmyD

+0

次に、データモデルをビューモデルに変換する必要があります。 NatTableはリストに作用します。ツリーへの変換はリストに基づいて行われます。そのリストにすべての企業およびすべての企業に関連するすべての役割が含まれていない場合、そのような構造を示すことはできません。 –

答えて

0

私は列の順序を変更しました。私は "名前"列の前に "モジュール名"を置いた。また、親モジュール名がモジュール名列に配置されています。これは私の問題を解決しました。

この場合の問題は、私が使用しcomperatorが同じフィールドでの混合データで作業されていないということでした。 TnxからDirk Fauthまで私はそれを見つけました。