Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未捕获类型错误:无法读取属性';行动';空的_Java_Jsf_Richfaces - Fatal编程技术网

Java 未捕获类型错误:无法读取属性';行动';空的

Java 未捕获类型错误:无法读取属性';行动';空的,java,jsf,richfaces,Java,Jsf,Richfaces,我有两个SelectOne菜单,如果第一个菜单中的值已更改并向后更改,我想更改第二个菜单的值。 这两份菜单上都是从1980年到2012年的年份。如果我在第一个菜单中选择1990年,我只希望在第二个菜单中选择1990-2012年 但如果我选择一个不同的值,什么也不会发生,当我分析这个元素时,我会得到以下消息: Uncaught TypeError: Cannot read property 'action' of null A4J.Query A4J.AJAX.PrepareQuery

我有两个SelectOne菜单,如果第一个菜单中的值已更改并向后更改,我想更改第二个菜单的值。 这两份菜单上都是从1980年到2012年的年份。如果我在第一个菜单中选择1990年,我只希望在第二个菜单中选择1990-2012年

但如果我选择一个不同的值,什么也不会发生,当我分析这个元素时,我会得到以下消息:

Uncaught TypeError: Cannot read property 'action' of null    
A4J.Query 
A4J.AJAX.PrepareQuery 
A4J.AJAX.Submit 
onchange
以下是我所拥有的:

<%-- Year filter --%>
<h:selectOneMenu id="minYear" value="#{statistics.minYear}" 
                 style="width: 75px">
    <f:selectItems value="#{statistics.minYearValues}" />
    <a4j:support event="onchange" action="#{statistics.minYearChanged}"
                 reRender="maxYear"/>
</h:selectOneMenu>

<h:selectOneMenu id="maxYear" value="#{statistics.maxYear}" 
                 style="width: 75px">
    <f:selectItems  value="#{statistics.maxYearValues}"/>
    <a4j:support event="onchange" action="#{statistics.maxYearChanged}"
                 reRender="minYear" />
</h:selectOneMenu>
<%-- end year filter--%>

这里是托管bean:

public List getMinYearValues() {
    this.minYear = MIN_YEAR;
    this.minYearValues = fillYearValues(MIN_YEAR, maxYear);
    return minYearValues;
}

public List getMaxYearValues() {
    int min = this.minYear;
    this.maxYearValues = fillYearValues(min, maxYear);
    return maxYearValues;
}

private List fillYearValues(int min, int max) {
    List values = new ArrayList();
    for(int i = min; i <= max; i++) {
        values.add(new SelectItem(i, String.valueOf(i)));
    }
    return values;
}

private int getPresentYear() {
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());

    return cal.get(Calendar.YEAR);
}

public void minYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.maxYearValues = fillYearValues(newValue, maxYear);
}

public void maxYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.minYearValues = fillYearValues(minYear, newValue);
}
public List getMinYearValues(){
this.minYear=minu YEAR;
this.minYearValues=fillYearValues(最小年,最大年);
返回最小值;
}
公共列表getMaxYearValues(){
int min=this.minYear;
this.maxYearValues=fillYearValues(最小值,最大值);
返回最大值;
}
私有列表fillYearValues(最小整数、最大整数){
列表值=新的ArrayList();

对于(int i=min;i我希望bean中
maxYearChanged
minYearChanged
方法的签名用作
action
是错误的。 应该是
public void maxYearChanged();

如果需要使用
ValueChangeEvent
,则必须使用
valueChangeListener


参考

最后我找到了一个解决方案。以下是我是如何做到的:

<a4j:region renderRegionOnly="true">

        <%-- Year filter --%>
        <h:selectOneMenu id="minYear" value="#{statistics.minYear}" 
                         style="width: 75px" onchange="this.form.submit()"
                         valueChangeListener="#{statistics.minYearChanged}">
            <f:selectItems value="#{statistics.minYearValues}" />
        </h:selectOneMenu>

        <f:verbatim>&#160;&#160;</f:verbatim>
        <h:outputText value="#{bundleStatistics['Label.minYearToMaxYear']}" />
        <f:verbatim>&#160;&#160;</f:verbatim>

        <h:selectOneMenu id="maxYear" value="#{statistics.maxYear}" 
                         style="width: 75px" onchange="this.form.submit()"
                         valueChangeListener="#{statistics.maxYearChanged}">
            <f:selectItems  value="#{statistics.maxYearValues}"/>
        </h:selectOneMenu>
    <%-- end year filter--%>

</a4j:region>

那么如何获取所选的值呢?JSF已经在
minYear
maxYear
属性上设置了它。您根本不需要值更改侦听器。
public void minYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.maxYearValues = fillYearValues(newValue, getPresentYear());
}

public void maxYearChanged(ValueChangeEvent event) {
    int newValue = new Integer(event.getNewValue().toString());
    this.minYearValues = fillYearValues(MIN_YEAR, newValue);
}