Treeview в Nattable

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

Но теперь я смотрю на TreeTable, как TreeGridWithCheckBoxFieldsExample из примеров Nattable. Единственное требование - я не должен менять свою модель данных на дерево.

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

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

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

После проверки некоторого примера 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);

Но когда я смотрю на таблицу, корневые элементы просматриваются, но дети корневых элементов не правы. Я просмотрел список элементов и там я не могу найти никаких проблем. Может кто-нибудь найти проблему, которая у меня есть?

1 ответ

Решение

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

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

Другие вопросы по тегам