我有一个示例表单,我正在测试p:tabView
p:tab
p:datatable
我可以在其中设置我想要显示的行数,并选择一行以在其他部分中显示其内容形式。问题是,当我选择表格的一行时,内容只显示一次。我可以选择不同的行并显示内容,但如果我多次选择同一行,则会出现此错误:
WARNING [http-nio-8084-exec-36] com.sun.faces.lifecycle.InvokeApplicationPhase.execute /index.xhtml @43,153 listener="#{controlador.seleccionoFila}": java.lang.NullPointerException
javax.el.ELException: /index.xhtml @43,153 listener="#{controlador.seleccionoFila}": java.lang.NullPointerException
//more
Caused by: java.lang.NullPointerException
at Controller.Controlador.seleccionoFila(Controlador.java:81)
//more
13-Feb-2015 07:54:23.933 SEVERE [http-nio-8084-exec-36] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError java.lang.NullPointerException
我不明白为什么。 我只知道如果我删除了ManagedBean中的错误行 - seleccionoFila()方法,它就可以了。我不知道是不是因为我在那里设置了一个值,这是唯一的区别
表格
<h:form id="form">
<p:tabView id="tabView">
<p:tab title="Uno">
<p:panelGrid columns="1">
<p:panelGrid columns="2">
<p:panelGrid columns="2">
<p:outputLabel value="Introduce el valor de j:"/>
<p:inputText value="#{controlador.j}"/>
<p:commandButton value="Listar tabla" action="#{controlador.listar}" update="tabla" />
</p:panelGrid>
<p:dataTable id="tabla" value="#{controlador.listaDos}" var="d" rowKey="#{d.idUno}" selectionMode="single" selection="#{controlador.dosSeleccionado}">
<p:ajax event="rowSelect" listener="#{controlador.seleccionoFila}" update=":form:tabView:pnlSeleccionado" />
<p:column headerText="ID">
<p:outputLabel value="#{d.idUno}"/>
</p:column>
<p:column headerText="Nombre">
<p:outputLabel value="#{d.nombreUno}"/>
</p:column>
<p:column headerText="Descripción">
<p:outputLabel value="#{d.descripcion}"/>
</p:column>
</p:dataTable>
</p:panelGrid>
<p:panelGrid id="pnlSeleccionado" columns="2">
<p:outputLabel value="ID seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.idUno}"/>
<p:outputLabel value="Nombre seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.nombreUno}"/>
<p:outputLabel value="Descripcion seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.descripcion}"/>
<p:outputLabel value="Otro campo"/>
<p:outputLabel value="#{controlador.otro}"/>
</p:panelGrid>
</p:panelGrid>
</p:tab>
</p:tabView>
</h:form>
ManagedBean
@ManagedBean
@ViewScoped
public class Controlador implements Serializable {
public Controlador() {
this.dos = new Dos();
this.j = 0;
this.listaDos = new ArrayList<>();
this.dosSeleccionado = new Dos();
}
private Dos dos;
private int j;
private List<Dos> listaDos;
private Dos dosSeleccionado;
private int otro;
//setters and getters
public void listar() {
this.listaDos = this.dos.listarDos(this.j);
}
public void seleccionoFila() {
this.otro = this.dosSeleccionado.getIdUno() * this.dosSeleccionado.getIdUno();
/*Error*/this.dosSeleccionado.setIdUno(this.dosSeleccionado.getIdUno() + 10);
}
}
乌诺
public class Uno implements Serializable{
private int idUno;
private String nombreUno;
//setters and getters
public LinkedList listarUno() {
LinkedList<Uno> listaUno = new LinkedList<>();
for (int i = 10; i < 21; i++) {
Uno u = new Uno();
u.idUno = i;
u.nombreUno = i + " " + (i + i);
listaUno.add(u);
}
return listaUno;
}
}
待办事项
public class Dos extends Uno implements Serializable {
private String descripcion;
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public LinkedList listarDos(int j) {
LinkedList<Dos> lista = new LinkedList<>();
for (int i = 0; i < j; i++) {
Dos d = new Dos();
d.setIdUno(i);
d.setNombreUno(i + " " + i);
d.setDescripcion(i + " " + i + " " + i + " " + i);
lista.add(d);
}
return lista;
}
}