在事件上更改JSF h:selectManyCheckbox的选定项目

时间:2011-08-24 11:14:41

标签: java jsp jsf checkbox

我的网站上有两个字段。 inputtext和selectManyCheckbox。在inputtext中,用户编写日期,如30.03.2014。 selectManyCheckbox包含一周中的所有日子(星期一,星期二......)。我尝试实现,如果用户在日期中写入,则在selectManyCheckbox中检查该日期的星期几。例如30.03.2014应该检查周日。

以下是我的jsp的一些代码:

<h:inputText value="#{course.startTime}" onblur="submit()" valueChangeListener="#{course.intervalDayEvent}" immediate="true">
    <f:converter converterId="dateConverter" />
</h:inputText>

<h:selectManyCheckbox layout="pageDirection" value="#{course.days}">
  <f:selectItems value="#{course.availableDays}" />
</h:selectManyCheckbox>

以下是managedBean的一些代码:

private List<String> days = new ArrayList<String>();
private List<SelectItem> availableDays = new ArrayList<SelectItem>();

@PostConstruct
public void init() {

    availableDays.add(new SelectItem("Montag", "Montag"));
    availableDays.add(new SelectItem("Dienstag", "Dienstag"));
    availableDays.add(new SelectItem("Mittwoch", "Mittwoch"));
    availableDays.add(new SelectItem("Donnerstag", "Donnerstag"));
    availableDays.add(new SelectItem("Freitag", "Freitag"));
    availableDays.add(new SelectItem("Samstag", "Samstag"));
    availableDays.add(new SelectItem("Sonntag", "Sonntag"));
    days.add("Montag");

}

public void intervalDayEvent(ValueChangeEvent event) {

    try {
        Date date = (Date) event.getNewValue();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int day = cal.get(Calendar.DAY_OF_WEEK);

        days.clear();

        switch (day) {
        case Calendar.MONDAY:
            days.add("Montag");
            break;
        case Calendar.TUESDAY:
            days.add("Dienstag");
            break;
        case Calendar.WEDNESDAY:
            days.add("Mittwoch");
            break;
        case Calendar.THURSDAY:
            days.add("Donnerstag");
            break;
        case Calendar.FRIDAY:
            days.add("Freitag");
            break;
        case Calendar.SATURDAY:
            days.add("Samstag");
            break;
        case Calendar.SUNDAY:
            availableDays.get(6).setLabel("Test");
            days.add("Sonntag");
            break;
        }

    } catch (Exception ex) {
        log.warn(ex.getMessage());
    }

    FacesContext context = FacesContext.getCurrentInstance();
    context.renderResponse();
}

正如你所看到的,星期一(Montag)是预先检查的。如果我在输入文本中键入30.03.2014,则星期日的标签将更改为“Test”。但是经过检查的项目不会从星期一变为星期日。

我希望你能帮助我。 :)

本杰明

1 个答案:

答案 0 :(得分:1)

我假设输入文本和selectManyCheckbox的格式相同?我无法看到JS函数submit()正在做什么,但我收集它只是提交整个表单。正在发生的是正在触发intervalDayEvent,但是因为表单已经提交,所以selectManyCheckbox然后在支持bean中设置其组件的值。

要解决此问题,您需要以2种不同的形式使用这些组件,或者使用一些ajax控件,这些控件仅在该值更改时设置输入文本而不是整个表单。下面的例子可以在RichFaces中显示,但我相信您可以使用其他JSF ajax库:

<h:inputText value="#{course.startTime}" valueChangeListener="#{course.intervalDayEvent}">
    <a4j:support event="onblur" reRender="daysChkBox" ajaxSingle="true"></a4j:support>
</h:inputText>
<h:selectManyCheckbox id="daysChkBox" layout="pageDirection" value="#{course.days}">
    <f:selectItems value="#{course.availableDays}"></f:selectItems>
</h:selectManyCheckbox>