af:table组件的“selectionListener”属性的默认值通常如下所示:
selectionListener="#{bindings.IterBinding.collectionModel.makeCurrent}"
但是如果需要一些特殊的选择处理,可以为选择事件指定自定义处理程序,通常在辅助bean中。作为此自定义处理程序的第一步,以编程方式调用使行为当前的默认功能。这可能类似于以下代码段:
public void testSelectionListener(SelectionEvent selectionEvent) {
JSFUtils.resolveMethodExpression("#{bindings.IterBinding.collectionModel.makeCurrent}", null,
new Class[]{SelectionEvent.class}, new Object[]{selectionEvent});
}
这应该与标准选择处理程序完全相同,对吧? 但事实并非如此 通过单击其中一个表列中的复选框触发选择更改时,此af:selectBooleanCheckbox的“valueChangeListener”不会在此时触发。它在第二次点击时会触发。使用默认的“selectionListener”时,它会始终按预期触发。
任何想法自定义处理程序有什么问题?
答案 0 :(得分:5)
好的,找到了这种奇怪行为的罪魁祸首
在编辑页面标记时,JDeveloper更改了" ChangeEventPolicy" pageDef文件中的迭代器绑定属性来自"默认(无)"到" ppr"。
这导致了这种奇怪的行为
手动恢复到原始值后,一切都按预期工作
" ppr"设置似乎很漂亮,我已经遇到类似问题af:panelTabbed,我不时在标签之间切换时收到一条神秘的错误信息。
答案 1 :(得分:0)
请尝试以下代码:
public void onTableSelect(SelectionEvent selectionEvent) {
// --- perform optional pre-processing here --- //
RichTable _table = (RichTable ) selectionEvent.getSource();
CollectionModel model = (CollectionModel ) _table.getValue();
JUCtrlHierBinding _binding = (JUCtrlHierBinding) model.getWrappedData();
DCIteratorBinding iteratorBinding = _binding.getDCIteratorBinding();
Object _selectedRowData = _table ́.getSelectedRowData();
JUCtrlHierNodeBinding node = (JUCtrlHierNodeBinding) _selectedRowData ;
Key rwKey = node.getRowKey();
iteratorBinding.setCurrentRowWithKey(rwKey.toStringFormat(true));
// --- perform optional post-processing here --- //
}