数组大小取决于runtinme上的学生大小。我能够基于数组boolean在JSF中的selectBooleanCheckbox上有效地显示布尔值。但是,在设置值时,会发生ClassCastException。
javax.el.ArrayELResolver.setValue(ArrayELResolver.java:260)中的java.lang.ClassCastException
在Managed Bean中:
enrollarr = new boolean[this.student.size()];
public boolean[] getEnrollarr() {
return enrollarr;
}
public void setEnrollarr(boolean[] enrollarr) {
this.enrollarr = enrollarr;
}
在JSF中:
<ui:repeat var="value" value="#{adminController.student}" varStatus="myvar" >
<tr>
<td>#{value.name}</td>
<td>#{value.TP}</td>
<td>#{value.gender}</td>
<td><h:selectBooleanCheckbox value="#{adminController.enrollarr[myvar.index]}" /></td>
</tr>
</ui:repeat>
你的问题中有一些不同的问题。
首先:数组的大小永远不会在运行时设置。数组必须在运行时之前分配内存。这意味着你:
enrollarr = new boolean[this.student.size()];
永远不会工作。您尝试在运行时分配内存。
在这种情况下,我建议使用一个ArrayList,用这样的布尔填充它。
List<boolean> enrollList = new ArrayList<>;
..并用他的功能添加值。
enrollList.add(new boolean(true));
这可能无法避免classCast案例。
所以第二:我猜你的班级演员抛在这里:
<td><h:selectBooleanCheckbox value="#{adminController.enrollarr[myvar.index]}" /></td>
你试着调用adminController。(get / set)enrollarr [myvar.index] ...但是这个函数不存在。
“translated”,frontEnd尝试调用adminController.setEnrollarr(true),正如我们所看到的:没有像.setEnrollarr(boolean)这样的函数.setEnrollarr(boolean [])]。
第三:但总的来说,我认为你的建设有点困惑。将enroll-boolean移动到Student类会更容易。然后你可以像其他变量一样调用它:
<ui:repeat var="value" value="#{adminController.student}" varStatus="myvar" >
<tr>
<td>#{value.name}</td>
<td>#{value.TP}</td>
<td>#{value.gender}</td>
<td><h:selectBooleanCheckbox value="#{value.enroll}" /></td>
</tr>
</ui:repeat>
这里是您的学生课程的补充。请注意:布尔getter以“is”开头。
public class Student{
public boolean enroll;
public boolean isEnroll() {
return enroll;
}
public void setEnroll(boolean enroll) {
this.enroll = enroll;
}
}
希望我的回答能带来一些澄清,并帮助你走得更远!