2013-10-04 152 views
0

我試圖在JSF中創建一個下拉框。它需要在給定的有效範圍內填充數字。舉例來說,如果給定範圍在5和20之間,應該比下拉值更大;JSF設置下拉列表

"5, 10 15, 20" 

我有一些問題,在我的控制,我創建這樣的事情,並設置值時for循環;

List<Integer> validAmounts OR 
List<String> validAmounts 

然後

<myapp:selectRowElem id="autoreloadamount" 
      type="dropdown" selectItems="#{settingsController.validAmounts}"/> 

我得到錯誤,說像

itemValue="#{i.value}": String does not have a property 'value' 

什麼想法?

還有更好的「JSF」方式設置有效的金額,但不是在我的控制器中創建for循環來設置validAmounts列表?

myapp:selectRowElem」很長,但它具有下拉菜單;

<h:selectOneMenu id="input" value="#{cc.attrs.item}" validatorMessage="#{msg[validatorMsgKey]}"> 
          <f:validateRequired disabled="#{cc.attrs.forceRequired ne 'true'}"/> 
          <f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" /> 
         </h:selectOneMenu> 
+0

問題出在''後面的代碼中,它不可識別爲標準JSF API的一部分,因此可能是本地或第三方的一部分。只要你對這個部分一無所知,任何人都不可能給你一個答案。如果我可以做一個瘋狂的猜測,那實際上是期待一個'List '。 – BalusC

+0

@BalusC我更新了代碼 – Spring

+0

@BalusC我coudl使用h:selectOneMenu代替selectRowElem,但所有樣式都不見了 – Spring

回答

2

此,

<f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" /> 

期望一個List<SomeObject>#{cc.attrs.selectItems},其中每個SomeObject項被指定爲這反過來預計有getValue()getLabel()方法分別返回的項目值和標籤循環變量#{i}

IntegerString都沒有這些getter方法。在String的情況下,這也正是例外情況。它找不到它的getValue()方法。

看來,#{cc.attrs.selectItems}期待一個List<SelectItem>其中SelectItem是標準JSF javax.faces.model.SelectItem對象which does have those getters

所以,你應該聲明和創建列表如下:

List<SelectItem> validAmounts; 

// ... 

validAmounts = new ArrayList<SelectItem>(); 
validAmounts.add(new SelectItem(5)); 
validAmounts.add(new SelectItem(10)); 
validAmounts.add(new SelectItem(15)); 
validAmounts.add(new SelectItem(20)); 

一個技術上有效的替代方法是創建一個自定義類像SomeObject與getter方法返回所需的值。但是,這種車輪的改造畢竟是功能簡單笨拙的,因此不推薦。


這一切的方式表示在<portal:selectRowElem>複合成分至少2個問題,這顯然是由別人開發:

  1. <cc:attribute name="selectItems">缺少shortDescription屬性,它應該清楚地解釋終端用戶(你)完全期待什麼價值。它應該說明它期望List<SelectItem>。這樣,您應該在代碼自動完成期間立即注意到它,或者通過瀏覽標籤文檔。

  2. 所有那些var,itemLabelitemValue屬性是完全多餘的。當提供List<SelectItem>時,它們都是默認值。這也表明原始複合組件開發人員不知道他在做什麼。

+0

謝謝!有沒有辦法設置下拉的寬度而不修改複合組件? – Spring

+0

不客氣。對於新問題,只需按右上方的「Ask Question」按鈕即可。 – BalusC

+0

請參閱http://stackoverflow.com/questions/19182887/jsf-how-to-set-dropdown-width – Spring