JSF复选框监听器

时间:2013-06-18 11:09:39

标签: jsf

<h:selectBooleanCheckbox id="deactivate" title="select to deactivate" />

我的JSF页面上有一个复选框和一个按钮。我希望仅在选中复选框时启用该按钮。

在我的java类中没有手动javascript和没有监听器方法的JSF方式是什么。应该有一种方式可以使用类似的表达式

"panel group rendered=#{}" 

一个按钮呈现为启用,一个按钮呈现或禁用。

2 个答案:

答案 0 :(得分:14)

  

在我的java类中没有javascript和没有监听器方法的JSF方式是什么

这显然是不可能的。我收集到你实际上的意思,“没有手动编写的JavaScript”(因此你接受<f:ajax>使用的JSF生成的JavaScript)和“没有手动编写的监听器方法”(因此你接受JSF自己的魔法组件树状态)。

在这种情况下,应该这样做:

<h:form>
    <h:selectBooleanCheckbox binding="#{checkbox}">
        <f:ajax render="button" />
    </h:selectBooleanCheckbox>
    <h:commandButton id="button" value="submit" 
        action="#{bean.submit}" 
        disabled="#{not checkbox.value}" />
</h:form>

这就是全部。不需要额外的JS代码或JSF bean属性或侦听器方法。只需submit()操作方法。

此示例中的binding属性会将UIComponent <h:selectBooleanCheckbox>#{checkbox.value}引用放在变量名称checkbox下的Facelet范围内。 EL表达式UISelectBoolean返回组件的value属性,该boolean属性表示How does the 'binding' attribute work in JSF? When and how should it be used?组件已经是disabled,可以在命令组件的disabled="#{not checkbox.value}"中使用属性。

注意:如果您在较旧的Eclipse版本中的{{1}}行遇到错误的EL错误,则需要按如下方式对其进行配置: Window&gt;偏好&gt;网络&gt; JavaServer Faces工具&gt;验证&gt; <类型强制问题>一元操作布尔强制问题将其设置为警告忽略而不是错误。自Eclipse Mars以来,这不再是必要的了。

另见:

  • {{3}}

答案 1 :(得分:3)

你需要通过在ajax调用上调用valueChangeListener来实现这一点,这样你就可以启用/禁用按钮
这是复选框和按钮

       <h:selectBooleanCheckbox id="deactivate" title="select to deactivate" 
valueChangeListener="#{bean.myChangeListener}" onchange="submit()">

        <h:selectManyCheckbox value="#{user.favNumber1}">
            <f:selectItem itemValue="1" itemLabel="Number1 - 1" />
            <f:selectItem itemValue="2" itemLabel="Number1 - 2" />
            <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
            <f:ajax event="change" execute="@this" render="dummyButton"/>
        </h:selectManyCheckbox>
    <h:commandButton id="dummyButton" value="OK" render="#{renderBean.myButton}">


您需要创建一个只有一个属性的渲染类,其值将在侦听器方法中设置i-e bean#myChangeListener

public class RenderBean{

    boolean myButton;
    public RendeBean(){

            myButton = true;

    }

    public void enableButton(){

          myButton = true;
    }

    public void disableButton(){

          myButton = false;
    }
}

这是您的bean#myChangeListener

public void myChangeListener(ValueChangeEvent e){
     RenderBean rb = (RenderBean) FacesContext.getCurrentInstance()
            .getExternalContext().getSessionMap().get("renderBean");
        if(e.getNewValue().toString().equals("1"))
                     rb.enableButton();
        else
                     rb.disableButton();
}