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