我是新来的,已经寻找了很长时间的类似问题,但没有成功。如果此问题已在其他地方解决,请指出我的答案,或者请告诉我在哪里可以阅读相应的文档。谢谢。
情况:我有一个带有动态列的数据表。过滤和排序工作。
我需要实现一个上下文菜单,该菜单读取表中的选定行,并根据所选行的单元格中的值采取不同的操作。当我尝试获取行时 java.lang.ArrayIndexOutOfBoundsException被扔了。
帮助和提示将不胜感激。
谢谢亚瑟
带有列和上下文菜单的数据表:
<p:contextMenu for="dataTable">
<p:menuitem value="Projektnavi"
icon="ui-icon-close"
actionListener="#{dataView.onContextMenuSelect('PROJEKTNAVI')}"/>
<p:menuitem value="Edit NOTIZ"
icon="ui-icon-close"
actionListener="#{dataView.onContextMenuSelect('NOTIZ')}"/>
<p:menuitem value="Edit STATUS"
icon="ui-icon-close"
actionListener="#{dataView.onContextMenuSelect('STATUS')}"/>
<p:menuitem value="Edit COVER"
icon="ui-icon-close"
actionListener="#{dataView.onContextMenuSelect('COVER')}"/>
<p:menuitem value="Edit PFAD"
icon="ui-icon-close"
actionListener="#{dataView.onContextMenuSelect('PFAD')}"/>
</p:contextMenu>
<p:dataTable draggableColumns="true"
draggableRows="true"
filteredValue="#{dataView.filtered}"
id="dataTable"
lazy="true"
paginator="true"
paginatorPosition="bottom"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
resizableColumns="true"
resizeMode="expand"
rowIndexVar="rowIndexVar"
rows="1000"
rowKey="#{layout[column.property]}"
rowsPerPageTemplate="5,10,15,20,50,100,200,500,1000,2000,5000"
scrollable="true"
scrollHeight="100%"
selection="#{dataView.selected}"
selectionMode="single"
sortMode="multiple"
style="margin-bottom:0"
value="#{dataView.lazyModel}"
var="layout"
widgetVar="widgetDataTable">
<p:ajax event="rowSelect" listener="#{dataView.onRowSelect}" />
<p:columns columnIndexVar="colIndex"
filterBy="#{layout[column.property]}"
filterMatchMode="in"
filterStyle="display: none; visibility: hidden;"
sortBy="#{layout[column.property]}"
style="text-align: #{column.align};"
value="#{dataView.columns}"
width="#{column.width}"
var="column">
<f:param name="rowId" value="#{rowIndexVar}" />
<f:facet name="header">
#{column.header}
</f:facet>
<f:facet name="filter">
<p:inputText id="filter" onkeyup="PF('widgetDataTable').filter()" />
</f:facet>
<h:outputText value="#{rowIndexVar} - #{layout[column.property]}" />
</p:columns>
<f:facet name="footer">
<p:dialog header="Info" widgetVar="layoutDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
<p:outputPanel id="layoutDetail" style="text-align:center;">
<p:panelGrid columns="2" rendered="true">
</p:panelGrid>
</p:outputPanel>
</p:dialog>
</f:facet>
</p:dataTable>
列模型代码
static public class ColumnModel implements Serializable {
private static final long serialVersionUID = -2504875837397753172L;
private final String header;
private final String property;
private final String align;
private final Integer width;
public ColumnModel(String header, String property, String align, Integer width) {
this.header = header;
this.property = property;
this.align = align;
this.width = width;
}
public String getHeader() {
return header;
}
public String getProperty() {
return property;
}
public Integer getWidth() {
return width;
}
public String getAlign() {
return align;
}
}
列生成代码:
protected void setDynamicColumns() {
String[] columnKeys = dataController.getTableHeaders();
columns = new ArrayList<>();
for (String columnKey : columnKeys) {
HashMap<String, Object> columnInfo
= dataController.getColumnInfo(layoutName, columnKey);
// Get field names and values from ab_umsatz_layout
Integer width = (Integer) columnInfo.get("FELD_WIDTH");
String align = (String) columnInfo.get("FELD_ALIGN");
ColumnModel columnModel
= new ColumnModel(columnKey.trim().toUpperCase(),
columnKey.trim(), align, width);
columns.add(columnModel);
}
}
onRowSelect 方法:
public void onRowSelect(SelectEvent selectEvent) {
DataTable dataTable = (DataTable) selectEvent.getComponent();
try {
Object selectedRow = dataTable.getRowData();
System.out.println(selectedRow);
}
catch (Exception e) {
e.printStackTrace();
}
}
生成的异常:
java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:418)
at java.util.ArrayList.get(ArrayList.java:431)
at org.primefaces.model.LazyDataModel.getRowData(LazyDataModel.java:56)
at javax.faces.component.UIData.getRowData(UIData.java:371)
at de.kma.kmaprojektliste.view.DataView.onRowSelect(DataView.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processCustomArgListener(AjaxBehaviorListenerImpl.java:107)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processArgListener(AjaxBehaviorListenerImpl.java:82)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:63)
at org.primefaces.event.AbstractAjaxBehaviorEvent.processListener(AbstractAjaxBehaviorEvent.java:38)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:805)
at javax.faces.component.UIData.broadcast(UIData.java:1086)
at javax.faces.component.UIData.broadcast(UIData.java:1108)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
尝试在 LazyDataModel 中覆盖 getRowData() 方法。 您可能会覆盖更多方法,因为它们正在使用此类的全局变量,这是麻烦的。试试这个。
@Override
public TEntity getRowData() {
int tempIndex= rowIndex;
if (tempIndex >= 0 && tempIndex < data.size())
return data.get(tempIndex);
else return null;
}
它为我解决了问题。我不确定该条件是否必要,但我认为问题是在此方法中重写了rowIndex,并且可能将其设置为-1。
对我来说,这种情况只发生在我使用p:datatable进行延迟加载时,并且我有一个带有按钮的p:dialog。通常用户必须非常非常快速地在对话框中提交表单。