2016-10-29 2 views
2

Мне нужно реализовать дерево на gwt. Я реализую объект, который расширяет виджет, чтобы установить его на TreeItem.Установить виджет на TreeItem на gwt

Проблема в том, что если я установил на 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; 
    } 
} 

ответ

1

Проблема в вашем классе ItemTree. Он расширяет виджет, но не устанавливает элемент для этого виджета. По крайней мере, ему не хватает метода 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())); // <- !!! 
    } 

    ... 
} 

Вы можете initWidget с любым Widget вы хотите - Label это самый простой рабочий пример - я успешно протестировали его.

+0

Спасибо, я постараюсь скоро. Я бы знал, в чем смысл расширения виджета, если этого недостаточно. – Peduz

+0

Я хотел бы задать вам еще одну вещь: если я добавлю узел clickListener для узлов, могу ли я использовать информацию об объекте, которая расширяет Composite на стороне сервера? Благодарю. – Peduz

+0

Я рад, что смогу помочь. Пожалуйста, напишите еще один вопрос (-ы), и мы постараемся ответить на них. – Adam

Смежные вопросы