2014-02-20 82 views
3

我有一個綁定到一個數字字段xpage上的組合框。用於填充的SelectItem值組合是在一個託管bean,看起來像這樣的代碼:與Integer值組合框

/* 
* 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?

請幫我分解一下這個。

感謝,奧維

回答

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; 
} 
0

數量文本框不一樣,如果在轉換器使用integerOnly=true使用整數值也。 你可以通過將這樣一個NumberField綁定到Bean來驗證這一點,使用Object作爲變量類型,並將sysout(newValue.class)添加到getter &設置器。

如果您使用Integer作爲vartype,則在將值設置爲Numberfield時,將會出現內部Invalid Argument異常。雙倍你應該保存並通過驗證。

這裏我怎麼會用豆(代碼是醜陋):

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; 
} 

我的組合框和我場,ATM的inputText的是隻讀的,否則它會得到從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>