Events 在调用expandItem()时防止激发事件

Events 在调用expandItem()时防止激发事件,events,tree,vaadin,Events,Tree,Vaadin,标题几乎说明了一切。当我以编程方式执行expandItem函数时,我不希望触发的事件导致nodeExpand调用 我已经实现了ExpandListener: @Override public void nodeExpand(ExpandEvent event) { System.out.println("This should only appear when the user clicks the node on the UI"); } 当我调用Tree类的expandItem函数时

标题几乎说明了一切。当我以编程方式执行expandItem函数时,我不希望触发的事件导致nodeExpand调用

我已经实现了ExpandListener:

@Override
public void nodeExpand(ExpandEvent event)
{
    System.out.println("This should only appear when the user clicks the node on the UI");
}
当我调用Tree类的expandItem函数时,总是会触发一个事件。这是原始树类的代码:

public boolean expandItem(Object itemId) {
    boolean success = expandItem(itemId, true);
    requestRepaint();
    return success;
}

private boolean expandItem(Object itemId, boolean sendChildTree) {

    // Succeeds if the node is already expanded
    if (isExpanded(itemId)) {
        return true;
    }

    // Nodes that can not have children are not expandable
    if (!areChildrenAllowed(itemId)) {
        return false;
    }

    // Expands
    expanded.add(itemId);

    expandedItemId = itemId;
    if (initialPaint) {
        requestRepaint();
    } else if (sendChildTree) {
        requestPartialRepaint();
    }
    fireExpandEvent(itemId);

    return true;
}
我现在所做的工作是:

m_Tree.removeListener((ExpandListener)this);
m_Tree.expandItem(sItemId);
m_Tree.addListener((ExpandListener)this);

有更好的方法吗?

您可以尝试创建一个切换到您的侦听器。例如:

private boolean listenerDisabled;

void setListenerDisabled(boolean disabled) 
{
    listenerDisabled = disabled;
}

@Override
public void nodeExpand(ExpandEvent event)
{
    if(listenerDisabled) return;
    System.out.println("This should only appear when the user clicks the node on the UI");
}
并在需要时禁用侦听器


如果有多个侦听器,您可以尝试创建树的子类并重写某些方法。

我以前有过类似的方法。我想知道这是否真的有效,因为每次以编程方式调用expandItem方法时,侦听器都会触发并捕获一个事件。但这并不意味着我的解决方案更快;在等待了大约一个月之后,我想没有比你或我的方法更好的解决方案了。所以我认为公平地说,你得到了最好的答案。