在 gwt 上将小部件设置为 TreeItem

Set widget to TreeItem on gwt

我必须在 gwt 上实现一个树。我正在实现一个扩展 Widget 的对象以将其设置在 TreeItem 上。

问题是,如果我在 TreeItem 上设置这个对象(只有字符串和整数字段),我就再也看不到树了。

问题出在哪里?我看不到。

private Tree frontEndTree;

private void buildTree(HashMap<Long, Categoria> categoriaMap) {
    for(Categoria categoria : categoriaMap.values()) {

        if(categoria.getLevel() != 1) continue;

        TreeItem firstLevel = //this.frontEndTree.addTextItem(categoria.getDescription());
        this.frontEndTree.addTextItem(categoria.getDescription());
        ItemTree itemTree = new ItemTree(categoria);
        firstLevel.setWidget((Widget)itemTree);
        this.visitaAlbero(firstLevel, categoria.getDescendants());
    }
} 
private void visitaAlbero(TreeItem parentItem, ArrayList<Categoria> categorie) {
    if(categorie == null) return;
    if(categorie.isEmpty()) return;

    TreeItem node = null;
    for(Categoria item : categorie) {
        if(node == null) {
            node = parentItem.addTextItem(item.getDescription());
            node.setWidget(new ItemTree(item));
            visitaAlbero(node, item.getDescendants());
            continue;
        }
        node.addTextItem(item.getDescription());
        node.setWidget(new ItemTree(item));
        visitaAlbero(node, item.getDescendants());
    }
}



/**
 * Inner class che gestisce il widget principale
 * del treeitem 
 * 
 * @author Giuseppe Pedullà
 *
 */
public class ItemTree extends Widget implements Serializable, IsWidget {

    /**
     * 
     */
    private static final long serialVersionUID = 5347332077472260376L;

    private Long id;

    private String description;

    private Integer level;

    public ItemTree(Categoria categoria) {
        this.id = categoria.getId();
        this.description = categoria.getDescription();
        this.level = categoria.getLevel();
    }
    public String getDescription() {
        String valueID = "";
        if(id < 10) {
            valueID = "00" + id;
        } else if(id < 100) {
            valueID = "0" + id;
        } else {
            valueID = "" + id;
        }
        return valueID + " - " + description;
    }

    //GETTERS
    public Long getId() {
        return id;
    }
    public Integer getLevel() {
        return level;
    }
    @Override
    public String toString() {
        return description;
    }   
} 

问题出在您的 ItemTree class 上。它扩展了 Widget 但不为该小部件设置任何元素。至少它缺少 asWidget 方法。例如,它可能是这样的:

@Override
public Widget asWidget() {
    return new Label(getDescription());
}

你可以这样使用它:

firstLevel.setWidget(itemTree.asWidget());

更简单的方法是扩展 Composite 而不是 Widget。您只需要在构造函数中调用 initWidget 方法:

public class ItemTree extends Composite implements Serializable, IsWidget {

    ...

    public ItemTree(Categoria categoria) {
        this.id = categoria.getId();
        this.description = categoria.getDescription();
        this.level = categoria.getLevel();
        initWidget(new Label(getDescription()));    // <- !!!
    }

    ...
}

你可以用任何你想要的Widget初始化Widget - Label是最简单的工作示例 - 我已经成功测试了它。