2016-09-30 2 views
0

Nattable에서 treeTable보기를 만드는 방법을 찾고 있습니다. 나는 이미 NatTable 필터, 정렬, 구현했습니다 ...Nattable의 Treeview

하지만 지금은 Nattable 예제에서 TreeGridWithCheckBoxFieldsExample과 같은 TreeTable을 찾고 있습니다. 유일한 요구 사항은 트리에 대한 데이터 모델을 변경하지 않는다는 것입니다.

두 개의 다른 회사와 역할이 있습니다. 모든 회사가 모든 역할을합니다. 그래서이 상황에서 모든 회사를 루트 개체로, 모든 역할을 모든 회사 아래에 두는 트리가 필요합니다. 나는 TreeList.Format를 구현하는 형식의 클래스를 작성해야하지만 그들은 그것이 MVC 원칙의 위반이기 때문에이 작업을 수행하지 않습니다 부모를 (링크 모델을 사용하는 것 같습니다 예에서

.

누군가 내가 작업 트리 테이블을 가지고 Natable의 몇 가지 예를 확인한 후? NatTable에서 트리 테이블 뷰를 생성하는 궤도에

날 수 있습니다. 그러나 하나의 문제는. 부모 항목이 제대로 표시되지 않습니다 떠났다.

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

나는 뷰 모델이다 사용하고 다음 소스와 함께 할 것입니다 나무 테이블에 데이터를 넣는 일반 모델

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

나는 컬럼의 순서로 변경되었습니다. "Name"열 앞에 "Module Name"을 놓았습니다. 상위 모듈 이름이 모듈 이름 열에 배치되었습니다. 이것은 내 문제를 해결했다.

이 경우 문제는 제가 사용했던 comperator가 같은 필드의 혼합 된 데이터에서 작동하지 않는다는 것입니다. Dnk Fauth에게 Tnx를 발견했습니다.