2011-10-03 38 views
1

我想創建一個自定義時間表,其中一個活動可以打開或關閉特定的時間。JSF選擇許多複選框與豐富的面孔重複/對齊

我現在所擁有的是一個表,它看起來像下面

names | Time1|time2|time3|time4| 
______________________________ 
name1 | box box box box box box 
name2 | box box box box box box 

我要的是與相應的時間正確對齊的箱子。所以我想知道是否可以將selectManyCheckBoxes分解成不同的列?

在碼是

<table> 
         <tr> 
          <th>&nbsp;</th> 
          <th> 
           <table class="times"> 
            <tr> 
             <td>12:00 AM</td> 
             <td>01:00 AM</td> 
             <td>02:00 AM</td> 
             <td>03:00 AM</td> 
             <td>04:00 AM</td> 
             <td>05:00 AM</td> 
             <td>06:00 AM</td> 
             <td>07:00 AM</td> 
             <td>08:00 AM</td> 
             <td>09:00 AM</td> 
             <td>10:00 AM</td> 
             <td>11:00 AM</td> 
             <td>12:00 PM</td> 
             <td>01:00 PM</td> 
             <td>02:00 PM</td> 
             <td>03:00 PM</td> 
             <td>04:00 PM</td> 
             <td>05:00 PM</td> 
             <td>06:00 PM</td> 
             <td>07:00 PM</td> 
             <td>08:00 PM</td> 
             <td>09:00 PM</td> 
             <td>10:00 PM</td> 
             <td>11:00 PM</td> 
            </tr> 
           </table> 
          </th> 
         </tr> 
         <a4j:repeat value="#{scheduleNames}" var="scheduleName"> 
          <tr> 
           <td> 
            <h:outputText value="#{scheduleName}" /> 
           </td> 
           <td> 
            <h:selectManyCheckbox styleClass="styledGroup" value="#{schedules[scheduleName]}"> 
             <f:selectItem itemLabel="12:00 AM" itemValue="0" /> 
             <f:selectItem itemLabel="01:00 AM" itemValue="1" /> 
             <f:selectItem itemLabel="02:00 AM" itemValue="2" /> 
             <f:selectItem itemLabel="03:00 AM" itemValue="3" /> 
             <f:selectItem itemLabel="04:00 AM" itemValue="4" /> 
             <f:selectItem itemLabel="05:00 AM" itemValue="5" /> 
             <f:selectItem itemLabel="06:00 AM" itemValue="6" /> 
             <f:selectItem itemLabel="07:00 AM" itemValue="7" /> 
             <f:selectItem itemLabel="08:00 AM" itemValue="8" /> 
             <f:selectItem itemLabel="09:00 AM" itemValue="9" /> 
             <f:selectItem itemLabel="10:00 AM" itemValue="10" /> 
             <f:selectItem itemLabel="11:00 AM" itemValue="11" /> 
             <f:selectItem itemLabel="12:00 PM" itemValue="12" /> 
             <f:selectItem itemLabel="01:00 PM" itemValue="13" /> 
             <f:selectItem itemLabel="02:00 PM" itemValue="14" /> 
             <f:selectItem itemLabel="03:00 PM" itemValue="15" /> 
             <f:selectItem itemLabel="04:00 PM" itemValue="16" /> 
             <f:selectItem itemLabel="05:00 PM" itemValue="17" /> 
             <f:selectItem itemLabel="06:00 PM" itemValue="18" /> 
             <f:selectItem itemLabel="07:00 PM" itemValue="19" /> 
             <f:selectItem itemLabel="08:00 PM" itemValue="20" /> 
             <f:selectItem itemLabel="09:00 PM" itemValue="21" /> 
             <f:selectItem itemLabel="10:00 PM" itemValue="22" /> 
             <f:selectItem itemLabel="11:00 PM" itemValue="23" /> 
            </h:selectManyCheckbox> 
           </td> 
          </tr> 
         </a4j:repeat> 
        </table> 

和日程表是Map<String, List<Integer>>

回答

1

<h:selectManyCheckbox>本身呈現<table>。所以你最終得到另一個<table>在一個單一的<td>,而不是所有的項目在單獨的<td> s。

改爲使用<h:selectBooleanCheckbox>。首先將Map<String, List<Integer>>物業類型更改爲Map<String, Boolean[]>(並確保您使用new Boolean[24]準備!)。然後改變視圖如下:

<td><label><h:selectBooleanCheckbox value="#{schedules[scheduleName][0]}" /> 12:00AM</label></td> 
<td><label><h:selectBooleanCheckbox value="#{schedules[scheduleName][1]}" /> 13:00AM</label></td> 
<td><label><h:selectBooleanCheckbox value="#{schedules[scheduleName][2]}" /> 14:00AM</label></td> 
<td><label><h:selectBooleanCheckbox value="#{schedules[scheduleName][3]}" /> 15:00AM</label></td> 
... 

List<Integer>是不合適的,因爲的<h:selectBooleanCheckbox>值必須是一個Boolean。 A List<Boolean>是笨拙的,因爲您需要預先填寫24 Boolean.FALSE條目以防止ArrayIndexOutOfBounds問題。所以,一個Boolean[]應該做的。

schedules.put(scheduleName, new Boolean[24]); 
// ... 

,你可以按照如下進行後處理回List<Integer>

Boolean[] checkedHours = schedules.get(scheduleName); 
List<Integer> hours = new ArrayList<Integer>(); 

for (int i = 0; i < checkedHours.length; i++) { 
    if (checkedHours[i]) { 
     hours.add(i); 
    } 
} 
+0

我用一個列表的唯一原因是因爲使用selectManyCheckbox的時候我可以風格很容易,並添加實際值成名單。快速的問題,你怎麼樣,所以它不顯示覆選框?我有一個白色/藍色框,點擊更改顏色,我不想使用複選框。它使用戶更容易看到。 – Kevin

+0

使用隱藏原始複選框的CSS/JS鏡頭,並讓新元素(span,div等)將點擊委託給它。谷歌使用關鍵字「CSS樣式複選框」可以找到幾個例子。 – BalusC

+0

好吧,但我仍然無法隱藏原始複選框。我現在基本上有兩個盒子。我們如何設想隱藏原始的JSF複選框? – Kevin