2016-09-30 35 views
0

我正在尋找一種方法來在Nattable中創建一個treeTable視圖。我已經有一個NatTable與過濾器,排序,...Treeview in Nattable

但現在我正在尋找一個TreeTable像Nattable示例中的TreeGridWithCheckBoxFieldsExample。唯一的要求是我不更改我的樹的數據模型。

我有兩個不同的對象公司和角色。每個公司都有所有的角色。所以在這種情況下,我需要一個樹,所有的公司都作爲根對象,所有公司下的所有角色。

從它看起來像我需要創建一個實現TreeList.Format格式類,但他們使用的模型,因爲它違反了MVC原則父(我不會做這個鏈接的例子。

有人可以讓我的軌道上創造NatTable一個treetable中的看法?

檢查Natable的一些例子,我有一個工作treetable中後,但只剩下一個問題。父項目無法正確顯示。

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; 
} 

,我用的是一個ViewModel,是一對一的映射到正常模式

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我找到了。