2011-05-04 1 views
4

TreeTable (wicket-extensions)에서 작업하고 있는데 행을 선택하기 위해 하나의 셀에서 링크를 클릭하는 일반적인 동작 대신 그 안에 아무 곳이나 클릭하여 행을 선택할 수 있기를 원합니다. 이 행을 나타내는 구성 요소에 AjaxEventBehavior ("onclick") 추가하여 가능해야 함을 이해하지만 행 구성 요소가 노출 된 메서드를 찾을 수 없습니다.wicket TreeTable의 행에 onclick 선택을 추가하는 방법?

답변

7

나는 해결책을 찾아 냈다. 행 요소는 TreeTable에서 populateTreeItem 메서드로 사용할 수 있습니다. 당신이 당신의 트리 테이블을 만들 때,이 방법과 같이 오버라이드 (override) : 행에 동작을 추가하는

@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); 
     }); 
    } 
}; 

일반적으로 유용합니다. 필자의 경우이 노드를 확장/계약하기로되어있는 클릭과 링크 클릭으로이 토글 온 클릭 동작을 조화시키기 위해 좀 더 오버 라이딩해야 할 것입니다.

이러한 경우 선택을 다시 선택하기 만하면 노드가 원하지 않는 상태로 들어갔다 나오는 노드를 간단히 전환하는 것이 좋지 않습니다. 이는 바람직하지 않습니다.

: 마지막으로

@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 추가 : 그것은 populateTreeItem에서 우리가 설정이 onClick 행동에 도달하기 전에 대신, 클릭 이벤트에 감동 될 onJunctionLinkClickedonNodeLinkClicked 방법을 오버라이드 (override)

/** 
* 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); 
}