gpt4 book ai didi

jsf - ADF AF :table restoring table state

转载 作者:行者123 更新时间:2023-12-04 18:48:11 25 4
gpt4 key购买 nike

我对 ADF Faces 表和动态区域有疑问。

先决条件:
Oracle JDeveloper 11.1.1.6.0

我正在使用 ADF Faces 和 ADF 绑定(bind)层在 af:table 中显示 Java POJO 列表。ADF 表显示在有界任务流内的 View 上。
此任务流用于另一个 View 上的动态区域。
导航包含两个链接,用于通过 bean-property 选择要在动态区域中显示的有界任务流。
动态区域通过任务流绑定(bind)接收“输入参数映射”。
该映射包含要在表中显示的 POJO 和一个状态 Bean,该状态 Bean 应保存表状态和 View 上可能的其他组件的状态(请参见下面的实现)。

问题/需求:

<强>1。预选:

在第一次加载表时根据 POJO 中包含的数据预选表中的单个行。

<强>2。保持对任务流切换的选择:

在切换到另一个有界任务流 B 并返回 A(表所在位置)后,还应选择表中的选定行(有界任务流 A)。

<强>3。无 MDS

不使用保存点/MDS 功能。

<强>4。一致的表模型和绑定(bind)层

在任务流之间切换和选择表中的元素后,应该可以询问表组件和所选行的绑定(bind)。
切换任务流和选择表中的元素后,表行和绑定(bind)中选择的行应该保持一致。

已经尝试过:

预选一行并在不使用 MDS/保存点的情况下保持对任务流切换的选择。

我已将一些表属性绑定(bind)到“状态”bean。bean 的实现附在下面。

<强>1。表的属性:

选定的行键:
selectedRowKeys="#{pageFlowScope.stateBean.tableStateBean.rowKeySet}"

绑定(bind) RichTable 的 Backing-Bean 属性:
binding="#{pageFlowScope.stateBean.tableStateBean.richTable}"

默认选择Listener
selectionListener="#{bindings.postanschriften.collectionModel.makeCurrent}"

我们在这里尝试了什么:
在表的初始加载和更改行 bean 方法 getRowKeySet(..) 被调用。
在此方法中,要选择的行是在初始表加载时计算的 (this.rowKeySet == null)。因为表属性 selectedRowKeys 绑定(bind)到 pageFlowScope.stateBean.tableStateBean.rowKeySet 如果在表中选择另一行,bean 中的属性将更新。如果我们将任务流从 A 更改为 B,反之亦然,则调用支持 bean 属性 richTable 的 getter。在 getter 方法中,选择状态被恢复。

<强>2。 “状态”bean 的实现:

public class TableStateBean {
private RichTable richTable;
private RowKeySet rowKeySet;
private String bindingIteratorName;
private RowMatcher matcher;

public RowKeySet getRowKeySet() {
if (this.rowKeySet == null) {
preselectRow();
}
return rowKeySet;
}

public RichTable getRichTable() {
if (richTable != null && rowKeySet != null) {
RowKeySet currentTableSelection = getCurrentTableSelection();
RowKeySet tableSelectionToRestore = getTableSelectionToRestore();
executeSelection(tableSelectionToRestore, currentTableSelection);
}
return richTable;
}

public void setRichTable(RichTable pRichTable) {
richTable = pRichTable;
}

public void doTableSelection(){
preselectRow();
}


private RowKeySet getCurrentTableSelection() {
Row currentRow = (Row) JSFUtils.resolveExpression("#{bindings." + this.bindingIteratorName + ".currentRow}");
Key currKey = currentRow.getKey();
ArrayList<Key> lst = new ArrayList<Key>(1);
lst.add(currKey);
RowKeySet keySet = new RowKeySetImpl();
keySet.add(lst);
return keySet;
}

private RowKeySet getTableSelectionToRestore() {
RowKeySet tableSelectionToRestoreRow = null;
RowSetIterator rowSetIterator = extractRowSetIterator();
int tableRowIndexOfCurrentSelectedKey = getSingleRowKeyIndexValue(this.rowKeySet);

if (tableRowIndexOfCurrentSelectedKey != -1) {
Row currentRow = rowSetIterator.first();
for (int i = 0; rowSetIterator.hasNext() && i < tableRowIndexOfCurrentSelectedKey; i++) {
currentRow = rowSetIterator.next();
}
if (currentRow != null) {
Key newSelectionKey = currentRow.getKey();

ArrayList<Key> keyList = new ArrayList<Key>(1);
keyList.add(newSelectionKey);

tableSelectionToRestoreRow = new RowKeySetImpl();
tableSelectionToRestoreRow.add(keyList);
}
}

return tableSelectionToRestoreRow;
}

private int getSingleRowKeyIndexValue(RowKeySet rowKeySet) {
int tableRowIndexOfCurrentSelectedKey = -1;

if (rowKeySet != null) {
Object[] rowKeySetArray = rowKeySet.toArray();
List<Key> selectedRowKeys = (rowKeySetArray.length > 0) ? (List<Key>) rowKeySetArray[0] : new ArrayList<Key>();
if (selectedRowKeys.size() > 0) {
Key currentSelectedKey = selectedRowKeys.get(0);
Object[] attributeValues = currentSelectedKey.getAttributeValues();
assert (attributeValues.length > 0);
tableRowIndexOfCurrentSelectedKey = (Integer) attributeValues[0];
}
}
return tableRowIndexOfCurrentSelectedKey;
}

private void executeSelection(RowKeySet newCurrentRow, RowKeySet oldCurrentRow) {
SelectionEvent selectionEvent = new SelectionEvent(oldCurrentRow, newCurrentRow, richTable);
selectionEvent.queue();
AdfFacesContext.getCurrentInstance().addPartialTarget(richTable);
}

protected void preselectRow() {
RowSetIterator rowSetIterator = extractRowSetIterator();

RowKeySet oldSelection = getCurrentTableSelection();
Row currentRow = rowSetIterator.first();
while (rowSetIterator.hasNext()
&& (!matcher.match(currentRow))) // Matcher selects which row should be displayed according to the Object bound behind the binding-layer.
{
currentRow = rowSetIterator.next();
}
if (currentRow != null) {

Key key = currentRow.getKey();
RowKeySet newSelection = createRowKeySet(key);
setActiveRowKey(key);
executeSelection(newSelection, oldSelection);
setRowKeySet(newSelection);
}
}

private void setActiveRowKey(Key pKey) {
ArrayList<Key> lst = new ArrayList<Key>(1);
lst.add(pKey);
this.richTable.setActiveRowKey(lst);
}

private RowKeySet createRowKeySet(Key pKey) {
ArrayList<Key> lst = new ArrayList<Key>(1);
lst.add(pKey);
RowKeySetImpl rowKeySetToCreate = new RowKeySetImpl();
rowKeySetToCreate.add(lst);
return rowKeySetToCreate;
}

private RowSetIterator extractRowSetIterator() {
DCIteratorBinding iteratorBinding = ADFUtils.findIterator(this.bindingIteratorName);
RowSetIterator rowSetIterator = iteratorBinding.getRowSetIterator();
return rowSetIterator;
}
}

在某些情况下,绑定(bind)层似乎与 RichTable 组件上选择的元素不同步。所以我猜上面提到的解决方案不是很稳健。

是否有另一种方法可以以稳健的方式归档上述功能?我认为根据绑定(bind)的 POJO 中的某些值预选表中的一行并不奇怪。并且在有界任务流(动态区域)之间切换后保持表格的选定行应该是可能的,不是吗?

期待您的帮助

问候,

最大

最佳答案

设置“选定”行相当容易。有几种解决方案。这只是其中之一:为您的表绑定(bind)到您的支持 bean。在 getter 中添加以下代码:

DCBindingContainer bindings = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding dcItteratorBindings =
bindings.findIteratorBinding("yourViewObjectIterator");
RowSetIterator it = dcItteratorBindings.getRowSetIterator();
Rows[] rows = voTableData.getAllRowsInRange();
Row needsSelection = null;
for(Row r: rows)
{
//just search for the row you want to set selected
if(r.getAttribute("SomeAttribute").eqauls(..))
needsSelection = r;
}

if(needsSelection != null)
it.setCurrentRow(needsSelection);

关于jsf - ADF AF :table restoring table state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13469113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com