在 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
是最简单的工作示例 - 我已经成功测试了它。
我必须在 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
是最简单的工作示例 - 我已经成功测试了它。