2016-09-30 7 views
0

Я ищу способ создания вида treeTable в Nattable. У меня уже есть NatTable с фильтрами, сортировкой, ...Treeview in Nattable

Но теперь я ищу TreeTable, как TreeGridWithCheckBoxFieldsExample из примеров Nattable. Единственное требование состоит в том, что я не изменяю свой datamodel для дерева.

У меня есть два разных объекта Компания и роль. У каждой компании есть все роли. Поэтому в этой ситуации мне нужно дерево со всеми компаниями как корневой объект и все роли под всеми компаниями.

Из примера он выглядит, как мне нужно создать класс формат, который реализует TreeList.Format, но они используют модель, чтобы связать родителя (я не буду это делать, потому что это нарушение принципа MVC.

Может кто-то получить меня на пути, чтобы создать TreeTable вид в NatTable?

После проверки некоторые пример Natable я получил рабочую TreeTable. Но только одна проблема. родительские элементы не показываются корректно.

The 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 и являюсь 12:59 картой для нормальной модели

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

я изменил порядок столбцов. Я поместил «Имя модуля» перед столбцом «Имя». И имя родительского модуля помещено в столбец имени модуля. Это устранило мою проблему.

Проблема в этом случае заключалась в том, что используемый множителем не работает с смешанными данными в тех же полях. Tnx to Dirk Fauth Я нашел его.

 Смежные вопросы

  • Нет связанных вопросов^_^