0

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

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

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

从示例看来,我需要创建一个实现 TreeList.Format 的格式类,但他们使用模型来链接父级(我不会这样做,因为它违反了 MVC 原则。

有人可以让我在 NatTable 中创建树表视图吗?

在检查了 Natable 的一些示例后,我得到了一个工作树表。但是只剩下一个问题了。父项未正确显示。

树格式看起来像:

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

但是当我查看表格时,会查看根元素,但根元素的子元素是错误的。我查看了元素列表,但找不到任何问题。有人可以找到我遇到的问题吗?

在此处输入图像描述

4

1 回答 1

0

我改变了列的顺序。我将“模块名称”放在“名称”列之前。并且父模块名已经放在了模块名列中。这解决了我的问题。

在这种情况下,问题是我使用的比较器没有处理相同字段中的混合数据。Tnx to Dirk Fauth 我找到了。

于 2016-10-04T06:09:16.660 回答