2014-02-20 2 views
3

У меня есть comboBox на xpage, связанном с полем Number. Код, используемый для заполнения значения SelectItem для комбо в управляемой фасоли, глядя, как это:comboBox с целыми значениями

/* 
* 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, так что часть определенно правильная.

В поле со списком используется числовой преобразователь, соответствующий полю в форме, только целое.

Проблема в том, что при этой конфигурации проверка не выполняется.

Я знаю, что на этом сайте есть еще один вопрос, который касается аналогичной проблемы, но мой имеет другой угол, поскольку я использую компонент. В другом вопросе было высказано предположение, что это сработало в 853 году, но не в 9. Если это так; Это ошибка? И имеет ли ошибка SPR?

Пожалуйста, помогите мне рассеять некоторый свет на этом.

Спасибо, Ove

ответ

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

текстовое поле Номера не использует значения Integer также, если вы используете integerOnly=true в конвертере. Вы можете проверить это, привязав такой NumberField к Bean, используя Object как переменный тип, и добавьте sysout (newValue.class) в getter & setter.

Если вы используете Integer как vartype, вы получите внутреннее исключение Invalid Argument при установке значения в поле Numberfield. С двойным вы должны сохранить и также пройти проверку.

Вот как я хотел бы использовать 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; 
} 

Мои выпадающие и мое поле, атм inputText только для чтения, в противном случае было бы получить значение из выпадающего списка и пользователя.

<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> 
Смежные вопросы