如何在wicket TreeTable的行中添加onclick选择?

psi*_*poo 4 java ajax wicket

我正在使用TreeTable(来自wicket扩展),我希望能够通过单击其中的任何位置来选择行,而不是通常单击一个单元格中的链接来选择行.我理解这可以通过向表示行的组件添加AjaxEventBehavior("onclick")来实现,但我似乎无法找到暴露行组件的任何方法.

psi*_*poo 7

之后我想出了一个解决方案.行元素在populateTreeItem方法中可用TreeTable.当您创建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);
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

通常用于向行添加行为.在我的情况下,我将不得不做一些更重要的事情来协调这种点击切换行为与应该扩展/收缩节点的点击以及链接点击.

在这些情况下再次切换选择具有短暂地切换节点进出不需要状态的不幸效果,这是不理想的.相反,覆盖onJunctionLinkClickedonNodeLinkClicked方法,在它到达onClick我们刚刚设置的行为之前,它将被click事件触及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();
}
Run Code Online (Sandbox Code Playgroud)

最后,添加方法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);
}
Run Code Online (Sandbox Code Playgroud)