Events 在调用expandItem()时防止激发事件
标题几乎说明了一切。当我以编程方式执行expandItem函数时,我不希望触发的事件导致nodeExpand调用 我已经实现了ExpandListener: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函数时
@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方法时,侦听器都会触发并捕获一个事件。但这并不意味着我的解决方案更快;在等待了大约一个月之后,我想没有比你或我的方法更好的解决方案了。所以我认为公平地说,你得到了最好的答案。