Vaadin - 在树形结构中添加重复项目

3
我是一位有用的助手,可以进行文本翻译。

我正在做一个Vaadin 7项目,在其中,我需要在树形结构中添加重复的项目。

我需要一个像这样的树形结构:

+ Person A
    Name
    Age
+ Person B
    Name
    Age

然而,Vaadin Tree组件并不会在树中添加重复的项。看起来它会覆盖之前的项。

在Vaadin中是否可能拥有像上面这样的树?我使用分层容器。

更新

    Object a = "a";
    Object b = "b";
    Object c = "c";
    Object d = "d";
    Object e = "a";
    Object alphabet = "alphabet";

    HierarchicalContainer aHC = new HierarchicalContainer();
    aHC.addItem(a);
    aHC.addItem(b);
    aHC.addItem(c);
    aHC.addItem(d);
    aHC.addItem(e);
    aHC.addItem(alphabet);
    aHC.setParent(a, alphabet);
    aHC.setParent(b, alphabet);
    aHC.setParent(c, alphabet);
    aHC.setParent(d, alphabet);
    aHC.setParent(e, alphabet);

    Tree tree = new Tree();
    tree.setContainerDataSource(aHC);

由于对象a和e的值都与'a'相同,因此树只会跳过或替换它。

动态代码

String[] items = {"alphabet", "a", "b", "c", "d", "a"};
for(String item : items) {
   Object itemId = tree.addItem();
   tree.setItemCaption(itemId, item);
}

现在我该如何将字母表设置为其他所有项目的父级?

你能展示一下你是如何添加项目以及使用了哪个容器的代码吗? - nexus
嘿 Nexus,我已经更新了我的问题。也许这会帮助你找到问题所在。 - Gugan
3个回答

2
问题在于 a.equals(e) == true。因此,层次容器不会将其添加两次。
你可以做两件事情:
1)
Object itemId = select.addItem();
select.setItemCaption(itemId, "The Sun");

更多信息请点击这里

2) 使用实现了toString()的POJO对象,在其中设置您的项目标题,或使用另一种项目标题模式,如select.setItemCaptionMode(Select.ITEM_CAPTION_MODE_XYZ);

同样可以在这里找到更多信息。

根据您的编辑:在添加子项后:

tree.setParent(itemChildId, itemAlphabetId);

请查看这个例子这里


嘿,Nexus.. 我有一个问题.. 我的树是动态的.. 我该如何处理对象? - Gugan
@Gugan 你所说的动态是什么意思? - nexus
请检查我的“动态代码”更新。 - Gugan

0

我已经完成了以下步骤来访问它:

类菜单

public class Menu implements Serializable{
    private static final long serialVersionUID = 4788509071437681011L;
    private String nodeName;

    public Menu(String nodeName) {
        this.nodeName = nodeName;
    }
    public Menu() {
    }
    public String getNodeName() {
        return nodeName;
    }
    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
   }
}

菜单标题类

public class MenuCaption implements ItemCaptionGenerator<Menu>{
    private static final long serialVersionUID = 5863017672993685887L;

    @Override
    public String apply(Menu item) {
        return item.getNodeName();
    }
} 

ViewClass 方法

private void loadMenu() {
TreeData<Menu> menuTreeData = new TreeData<>();
Menu menu = null;
Menu childMenu = null; 
Tree<Menu> menuTree =  new Tree<>();
    try {
        menu = new Menu("General");
        menuTreeData.addItem(null, menu);

        menu = new Menu("Eze");
        menuTreeData.addItem(null, menu);
        childMenu = new Menu("Investor Activity");
        menuTreeData.addItem(menu, childMenu);
        childMenu = new Menu("Investor Statement");
        menuTreeData.addItem(menu, childMenu);

        menu = new Menu("Investran");
        menuTreeData.addItem(null, menu);

        menu = new Menu("VPM");
        menuTreeData.addItem(null, menu);
        childMenu = new Menu("Investor Activity");
        menuTreeData.addItem(menu, childMenu);
        childMenu = new Menu("Investor Statement");
        menuTreeData.addItem(menu, childMenu);

        TreeDataProvider<Menu> dataProvider = new TreeDataProvider<Menu>(menuTreeData);
        menuTree.setDataProvider(dataProvider);
        menuTree.setItemCaptionGenerator(new MenuCaption());
        this.mainHorizontalSplitPanel.setFirstComponent(menuTree);
    }catch (Exception e) {
        e.printStackTrace();
    }
}

输出类似于以下内容

General
>Eze
    Investor Activity
    Investor Statement
Investran
>VPM
    Investor Activity
    Investor Statement

0

关键在于为每个项目拥有独特的ID并修改标题。类似这样:

String[] items = {"alphabet", "a", "b", "c", "d", "a"};
int counter = 1;
for(String item : items) {
   Object itemId = tree.addItem(counter);
   tree.setItemCaption(counter, item);
   if(counter >1) {
     tree.setParent(counter, 1);
   }
   counter++;
}

根据定义,树形结构中不能有具有相同ID的多个项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接