Как добавить выборку по клику в строки калитки TreeTable? - PullRequest
4 голосов
/ 04 мая 2011

Я работаю с TreeTable (из расширений wicket), и я хотел бы иметь возможность выбирать строку, щелкая в любом месте внутри нее, вместо обычного поведения щелчка по ссылке в одной ячейке, чтобы выбрать строку.Я понимаю, что это должно быть возможно путем добавления AjaxEventBehavior ("onclick") к компоненту, представляющему строку, но я не могу найти какие-либо методы, где выставляется компонент строки.

1 Ответ

7 голосов
/ 05 мая 2011

Я разобрался с решением после. Элемент строки доступен в методе populateTreeItem из 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);
        });
    }
};

Обычно полезно для добавления поведения в строки. В моем случае мне придется сделать еще несколько переопределений, чтобы согласовать это поведение при переключении по щелчку с щелчками, которые должны расширять / сжимать узлы, а также по ссылкам.

Просто повторное переключение выбора в этих случаях приводит к неудачному эффекту кратковременного переключения узла в нежелательное состояние и из него, что не является идеальным. Вместо этого переопределите методы onJunctionLinkClicked и onNodeLinkClicked, которые будут затронуты событием щелчка, прежде чем оно перейдет к поведению 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();
}

Наконец, добавьте методы skipNextRowClick и rowClickSelect:

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