我要冒昧一点,因为我实际上还没有在GWT中使用过
Tree
,但是我发现
TreeItem
类是
UIObject
的子类。任何
UIObject
都可以调用其
setTitle()
方法。在幕后,此方法将标准HTML标题属性设置为您传递给
setTitle()
的任何字符串。
这应该可以为您提供所需的工具提示行为。作为额外的奖励,浏览器为您处理所有鼠标事件:
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
public class TreeTest extends Composite {
public TreeTest() {
Tree root = new Tree();
initWidget(root);
TreeItem dogs = new TreeItem("canines");
dogs.addItem("Fido").setTitle("faithful");
dogs.addItem("Lassie").setTitle("starlet");
dogs.addItem("Touser").setTitle("ruthless killer");
root.addItem(dogs);
TreeItem cats = new TreeItem("felines");
cats.addItem("Boots").setTitle("needy");
cats.addItem("Fabio").setTitle("aloof");
cats.addItem("Mandu").setTitle("bob seger");
root.addItem(cats);
}
}
编辑:现在让我们想象一下,您不想使用上述浏览器内置的工具提示机制,并且希望自己处理鼠标事件。
TreeItem
表面上看起来可能不可行。毕竟,它直接从 UIObject
继承,而不是从 Widget
继承。(Widget
增加到 UIObject
的关键区别是能够处理事件。因此,人们认为我们无法向 TreeItem 添加处理程序!)
尽管这是严格正确的,但请注意,TreeItem
给我们提供了以下构造函数:
public TreeItem(Widget widget)
因此,当我们创建每个实例时,可以将真正的Widget
传递给它(例如Label
或您自己的class MyWidget extends Composite
),并且我们可以直接向其添加事件处理程序:
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
public class AnotherTreeTest extends Composite {
public AnotherTreeTest() {
Tree root = new Tree();
initWidget(root);
TreeItem dogs = new TreeItem("canines");
makeItem(dogs,"Fido","faithful");
makeItem(dogs,"Lassie","starlet");
makeItem(dogs,"Touser","ruthless killer");
root.addItem(dogs);
TreeItem cats = new TreeItem("felines");
makeItem(cats,"Boots","needy");
makeItem(cats,"Fabio","aloof");
makeItem(cats,"Mandu","bob seger");
root.addItem(cats);
}
private void makeItem(TreeItem parent, String name, final String tip) {
Label label = new Label(name);
TreeItem animal = new TreeItem(label);
label.addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
GWT.log("mouse over " + tip);
}
});
label.addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
GWT.log("mouse out " + tip);
}
});
parent.addItem(animal);
}
}
请注意,可能有其他更便宜的方法来实现这一点。如果您有一棵巨大的树,则为每个节点创建一个小部件可能会变得昂贵。那么您可能需要探索一种更复杂的处理鼠标事件的方式,例如通过拥有一个检查其所在元素的处理程序。
TreeItem
用于表示每个节点,因此您应该能够在每个节点上调用setTitle()
以给每个节点设置不同的工具提示。请注意,几乎GWT中的所有内容最终都继承自UIObject
,因此这是一个非常通用的规则。每当您想要工具提示时,请查看Javadoc - 如果在超类链中看到UIObject
,那么就可以使用它。 - pohl