问题是,如果该分支具有当前选定的节点,我不希望用户能够关闭树的分支。主要问题是,一旦关闭分支,GWT树似乎忘记了选择。这令人困惑。我正在查看像CloseHandler这样的事件处理程序,但我不认为我可以阻止结束发生(或者我应该尝试立即重新打开同一节点?)
对于上下文,这里是我正在谈论的树:
http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/Tree.html
答案 0 :(得分:3)
从阅读Tree
和TreeItem
的工作方式来看,最好的选择是将TreeItem
子类化并覆盖setState(boolean, boolean)
,以便在某些条件为真时提前返回。
public class CustomTreeItem extends TreeItem {
@Override
public void setState(boolean open, boolean fireEvents) {
//check if we want to allow the item to close
if (!open && !mayClose()) {
return;
}
super.setState(boolean open, boolean fireEvents);
}
/**
* Returns true if the item may be closed, due to some specific rules
*/
public boolean mayClose() {
// your check goes here
}
}
这样做的缺点是,您需要创建自己的实例,而无需您希望此逻辑工作。使这更容易的一种方法是覆盖各种addItem(...)
和addTextItem(...)
方法,以便始终创建此子类的实例。
在CloseEvent
方法中,Tree.fireStateChanged(TreeItem, boolean
被解雇(查看GWT 2.4.0,旧版本可能会有所不同)。这是一个受包保护的方法,因此无法访问,而且不是实际重大改变dom的方法。
Tree.fireStateChanged
,该方法在上面被覆盖。此方法不仅要负责检查打开是否有意义,还要在不需要时避免重绘,并执行实际重绘。它呼叫树要求它发射事件。更改此代码将确保即使在未触发事件的情况下(在GWT代码中找不到,您可能有一些),它仍将执行您的逻辑。
TreeItem.setState(boolean,boolean)
从GWT中的两个位置调用,一个来自TreeItem.setState(boolean)
,作为便捷方法,一次在用户点击元素时(参见Tree.elementClicked(Element)
)。从三个地方调用另一个覆盖TreeItem.setState(boolean)
,所有这些都与键盘导航有关。由此,我们可以确定这是与更改树展开/折叠状态有关的主要方法,我们可以确信更改它将正确地影响树的行为。