2011-05-04 29 views
4

我正在使用TreeTable(來自wicket-extensions),我希望能夠通過單擊其中的任何位置來選擇一行,而不是點擊一個單元格中的鏈接來選擇行。我知道這應該是可能的通過添加一個AjaxEventBehavior(「onclick」)到代表行的組件,但我似乎無法找到行組件暴露的任何方法。如何將onclick選擇添加到wicket TreeTable的行?

回答

7

我想出了一個解決方案後。行元素可從TreeTablepopulateTreeItem方法中獲得。在創建treetable時,請覆蓋此方法,如下所示:

@Override 
protected void populateTreeItem(final WebMarkupContainer item, final int level) { 
    super.populateTreeItem(item, level); 
    item.add(new AjaxEventBehavior("onclick") { 
     @Override 
     protected void onEvent(final AjaxRequestTarget target) { 
      final TreeNode node = ((TreeNode) item.getDefaultModelObject()); 
      rowClickSelect(node); 
     }); 
    } 
}; 

通常在向行添加行爲時很有用。就我而言,我不得不做一些更重要的操作來協調這個切換點擊行爲與應該展開/收縮節點的點擊以及鏈接點擊。

在這些情況下再次切換選擇具有短暫切換節點進出不需要的狀態的不幸效果,這並不理想。相反,覆蓋onJunctionLinkClickedonNodeLinkClicked方法,這將是一個click事件被觸摸它到達onClick行爲之前,我們只是建立在populateTreeItem

@Override 
protected void onJunctionLinkClicked(final AjaxRequestTarget target, final TreeNode node) { 
    super.onJunctionLinkClicked(target, node); 
    skipNextRowClick(); 
} 

@Override 
protected void onNodeLinkClicked(final AjaxRequestTarget target, final TreeNode node) { 
    super.onNodeLinkClicked(target, node); 
    skipNextRowClick(); 
} 

最後,添加方法skipNextRowClickrowClickSelect

/** 
* Ensure the next call to rowClickSelect() will have no effect. 
*/ 
private void skipNextRowClick() { 
    this.skipNextClickSelect = true; 
} 

private void rowClickSelect(final TreeNode node) { 
    if (this.skipNextClickSelect) { 
     this.skipNextClickSelect = false; 
     return; 
    } 
    // select on click row 
    final boolean isSelected = Log4jPanel.this.treeTable.getTreeState().isNodeSelected(node); 
    treeTable.getTreeState().selectNode(node, !isSelected); 
} 
相關問題