【问题标题】:Change selected item of JSF h:selectManyCheckbox on event在事件中更改 JSF h:selectManyCheckbox 的选定项
【发布时间】:2011-08-24 11:14:40
【问题描述】:

我的网站中有两个字段。一个 inputtext 和一个 selectManyCheckbox。在输入文本中,用户写了一个日期,例如 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) 已预先检查。如果我在 inputtext 中输入 30.03.2014,星期天的标签将变为“测试”。但是选中的项目从周一到周日没有变化。

我希望你能帮助我解决这个问题。 :)

本杰明

【问题讨论】:

    标签: java jsp jsf checkbox


    【解决方案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>
    

    【讨论】:

    • 嗯,这行不通。 :( 这是一个 selectManyCheckbox,用户可以检查多个项目。所以它必须是一个列表。?带有日期的预检查是一个建议。无论如何,感谢您的回答!
    • 对不起,我错过了。我知道原因是它发生的方式会相应地修改我的答案
    • 是的,inputTextfields 的格式相同。因为我在 Liferay 5 环境中工作,所以我必须使用带有 portlet 桥的 JSF 1.2,我很高兴它可以工作。直到现在我才能让 a4j 工作。所以我现在使用这两种形式。谢谢!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2021-11-11
    • 2020-06-29
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多