我正在尋找一種方法來在Nattable中創建一個treeTable視圖。我已經有一個NatTable與過濾器,排序,...Treeview in Nattable
但現在我正在尋找一個TreeTable像Nattable示例中的TreeGridWithCheckBoxFieldsExample。唯一的要求是我不更改我的樹的數據模型。
我有兩個不同的對象公司和角色。每個公司都有所有的角色。所以在這種情況下,我需要一個樹,所有的公司都作爲根對象,所有公司下的所有角色。
從它看起來像我需要創建一個實現TreeList.Format格式類,但他們使用的模型,因爲它違反了MVC原則父(我不會做這個鏈接的例子。
有人可以讓我的軌道上創造NatTable一個treetable中的看法?
檢查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);
但是當我查看錶格時,根元素被查看,但根元素的孩子是錯誤的。我查看了元素列表,在那裏我找不到任何問題。有人能找到我有的問題嗎?
我不明白你對TreeList.Format和MVC的關注。 NatTable是視圖,TreeList.Format是其中的一部分。它需要顯示與模型相關的內容。因此,我認爲TreeList.Format作爲視圖一部分依賴於模型來構建樹結構是非常好的。那麼你有什麼關注的細節?你如何從數據模型構建樹結構而不從模型獲取信息? –
在某些情況下可以很好。但在我的情況下,角色不需要知道他的父母(公司)的任何信息。否則,我需要爲每個公司創建相同的角色(所有公司都有1個角色)。 – JimmyD
然後,您需要將您的數據模型轉換爲視圖模型。 NatTable在列表上運行。並且基於列表完成對樹的轉換。如果該清單不包含與所有公司有關的所有公司和所有角色,則不可能展示這樣的結構。 –