具有整数值的comboBox

时间:2014-02-20 22:55:57

标签: java xpages

我在一个绑定到Number字段的xpage上有一个comboBox。用于填充组合的SelectItem值的代码位于托管bean中,如下所示:

/*
 * Returns last year, current year and next year as List<SelectItem>
 * For use with comboBox selection values
 */
public List<SelectItem> getYearSelectItems() {
    int thisYear = Calendar.getInstance().get(Calendar.YEAR);
    List<SelectItem> selectItems = new ArrayList<SelectItem>();
    selectItems.add(new SelectItem(new Integer(thisYear - 1), new Integer(thisYear - 1).toString()));
    selectItems.add(new SelectItem(new Integer(thisYear), new Integer(thisYear).toString()));
    selectItems.add(new SelectItem(new Integer(thisYear + 1), new Integer(thisYear + 1).toString()));

    for(int i = 1; i < selectItems.size(); i ++) {
        System.out.println(new Integer(i).toString() + ": " + selectItems.get(i).getValue().getClass());
    }
    return selectItems;
}

正如您所看到的,我将SelectItem值的类名打印到控制台以进行调试。控制台中列出的类名是java.lang.Integer,因此该部分绝对正确。

组合框使用数字转换器来匹配表单中的字段,仅限整数。

问题在于,使用此配置验证失败。

我知道这个网站上还有另一个问题可以解决类似的问题,但是因为我使用bean,所以我的角度不同。 在另一个问题中,有人建议这在853工作,但不在9工作。如果是这样的话;这是一个错误吗?这个bug有SPR吗?

请帮我澄清一下。

谢谢,Ove

2 个答案:

答案 0 :(得分:2)

由于某些奇怪的原因,<xp:convertNumber>错误解释了SelectItem(<Integer>, <String>)。改为Double解决了我的问题。

代码:

/*
 * Returns last year, current year and next year as List<SelectItem>
 * For use with comboBox selection values
 */
public List<SelectItem> getYears() {
    int thisYear = Calendar.getInstance().get(Calendar.YEAR);
    List<SelectItem> years = new ArrayList<SelectItem>();
        years.add((new SelectItem(new Double(thisYear - 1), new Integer(thisYear - 1).toString())));
        years.add(new SelectItem(new Double(thisYear), new Integer(thisYear).toString()));
        years.add(new SelectItem(new Double(thisYear + 1), new Integer(thisYear + 1).toString()));

    }
    return years;
}

答案 1 :(得分:0)

如果在转换器中使用integerOnly=true,则“数字文本”框也不使用“整数”值。 您可以通过使用Object作为变量类型将这样的NumberField绑定到Bean来验证这一点,并将sysout(newValue.class)添加到getter&amp; setter。

如果使用Integer作为vartype,则在将值设置为Numberfield时将获得内部Invalid Argument异常。使用double时,您应该保存并通过验证。

这里我将如何使用Bean(代码很难看):

private static Map<String,Integer> years;
private double selectedYear = 2013;

static {
    Integer thisYear = Calendar.getInstance().get(Calendar.YEAR);       
    years = new LinkedHashMap<String, Integer>();
    years.put(new Integer(thisYear - 1).toString(),new Integer(thisYear - 1));
    years.put((thisYear).toString(),new Integer(thisYear));
    years.put(new Integer(thisYear + 1).toString(),new Integer(thisYear + 1));  
}

public void yearChanged(ValueChangeEvent e){
    System.out.println("event Start " + selectedYear);
    selectedYear = years.get(e.getNewValue());//Set new Value to field
    System.out.println("event End " + selectedYear);
}
public Object[] getYearInMap() {//select Items
    return this.years.keySet().toArray();
}

      //Binding for the NumberField
public void setSelectedYear(double selectedYear) {
    this.selectedYear = selectedYear;
}
public double getSelectedYear() {
    return selectedYear;
}   

My Combobox和我的Field,输入文本是只读的,否则它会从Combobox和用户那里得到一个值。

    <xp:comboBox
        loaded="true"
        id="comboBox2"
        valueChangeListener="#{XPageBean.yearChanged}"
        defaultValue="#{XPageBean.selectedYear}">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript:XPageBean.getYearInMap();}]]></xp:this.value>
        </xp:selectItems>
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="partial"
            refreshId="refresh">
            <xp:this.action><![CDATA[#{javascript://}]]></xp:this.action>
        </xp:eventHandler>
    </xp:comboBox>

<xp:panel id="refresh">
    <xp:inputText
        id="txt_out3"
        value="#{XPageBean.selectedYear}"
        defaultValue=""
        readonly="true">
        <xp:this.converter>
            <xp:convertNumber
                type="number"
                integerOnly="true">
            </xp:convertNumber>
        </xp:this.converter>
    </xp:inputText>
    <xp:text id="txt_out2"
        value="#{XPageBean.selectedYear}">
        <xp:this.converter>
            <xp:convertNumber
                type="number"
                integerOnly="true">
            </xp:convertNumber>
        </xp:this.converter>
    </xp:text>
</xp:panel>