阻止GWT树关闭具有所选节点的分支

时间:2012-02-17 23:50:48

标签: java gwt google-chrome

问题是,如果该分支具有当前选定的节点,我不希望用户能够关闭树的分支。主要问题是,一旦关闭分支,GWT树似乎忘记了选择。这令人困惑。我正在查看像CloseHandler这样的事件处理程序,但我不认为我可以阻止结束发生(或者我应该尝试立即重新打开同一节点?)

对于上下文,这里是我正在谈论的树:

http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/Tree.html

1 个答案:

答案 0 :(得分:3)

从阅读TreeTreeItem的工作方式来看,最好的选择是将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的方法。

从TreeItem.setState调用

Tree.fireStateChanged,该方法在上面被覆盖。此方法不仅要负责检查打开是否有意义,还要在不需要时避免重绘,并执行实际重绘。它呼叫树要求它发射事件。更改此代码将确保即使在未触发事件的情况下(在GWT代码中找不到,您可能有一些),它仍将执行您的逻辑。

TreeItem.setState(boolean,boolean)从GWT中的两个位置调用,一个来自TreeItem.setState(boolean),作为便捷方法,一次在用户点击元素时(参见Tree.elementClicked(Element))。从三个地方调用另一个覆盖TreeItem.setState(boolean),所有这些都与键盘导航有关。由此,我们可以确定这是与更改树展开/折叠状态有关的主要方法,我们可以确信更改它将正确地影响树的行为。