Nattable 中的树视图

Treeview in Nattable

我正在寻找一种在 Nattable 中创建 treeTable 视图的方法。我已经有一个 NatTable 实现了过滤器,排序,...

但现在我正在研究像 Nattable 示例中的 TreeGridWithCheckBoxFieldsExample 这样的 TreeTable。唯一的要求是我不更改树的数据模型。

我有两个不同的对象公司和角色。每个公司都有所有的角色。所以在这种情况下,我需要一棵树,其中包含所有公司作为根对象以及所有公司下的所有角色。

从这个例子看来我需要创建一个实现 TreeList.Format 的格式 class 但他们正在使用模型 link 父级(我不会这样做因为违反了MVC原则。

有人可以帮助我在 NatTable 中创建树table 视图吗?

在检查了 Na 的一些示例后table 我得到了一个可用的 treeTable。但是只剩下一个问题了。父项未正确显示。

树格式看起来像:

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

}

将数据放入树 table 将使用以下来源完成:

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

但是当我查看 table 时,虽然查看了根元素,但是根元素的子元素是错误的。我查看了元素列表,但没有发现任何问题。有人能找到我遇到的问题吗?

我更改了列的顺序。我将 "Module Name" 放在 "Name" 列之前。并且父模块名称已经放在模块名称栏中。这解决了我的问题。

本例中的问题是我使用的计算器无法处理相同字段中的混合数据。 Tnx to Dirk Fauth 我找到了。