Я ищу способ создания вида 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);
Но когда я смотрю на таблицу, просматриваются корневые элементы, но элемент корневых элементов неверен. Я просмотрел список элементов, и там я не могу найти никаких проблем. Может ли кто-нибудь найти вопрос, который у меня есть?
Я не понимаю ваших опасений относительно TreeList.Format и MVC. NatTable - это представление и TreeList.Format является его частью. Он должен показать что-то, связанное с моделью. Поэтому я думаю, что отлично, что TreeList.Format как часть представления полагается на модель для построения древовидной структуры. Итак, каковы ваши проблемы в деталях? И как вы хотите построить древовидную структуру из своей модели данных, не получая информацию от модели? –
В некоторых ситуациях это может быть хорошо. Но в моей ситуации Ролям не нужно ничего знать о его родителе (компании). В противном случае мне нужно создать ту же роль для каждой компании (1 роль существует во всех компаниях). – JimmyD
Затем вам нужно преобразовать вашу модель данных в модель представления. NatTable работает с списками. И преобразование в дерево выполняется на основе списка. Если этот список не содержит всех компаний и всех ролей, связанных со всеми компаниями, невозможно показать такую структуру. –