如何通过Id获取我的commandButton?

时间:2013-09-08 14:30:59

标签: jsf primefaces

我想根据预先选择的图标更改commandButton的ActionListener:

        <p:dialog id="dialog" header="Add Memo" widgetVar="dialogMemo" resizable="false" >
        <h:form>
            <h:panelGrid columns="2" cellpadding="5">  
                <h:outputLabel for="commentInput" value="Comment:" />  
                <p:inputTextarea id="commentInput" value="#{dashboardBean.getCurrentComment()}" rows="6" cols="25" label="commentInput"/>
                <p:watermark for="commentInput" value="Enter your memo..."/>  
                <h:outputLabel for="selectShare" value="Share Memo: " />  
                <p:selectBooleanCheckbox id="selectShare" /> 

                <h:outputLabel for="choosePriority" value="Priority:" />  
                <p:selectOneMenu id="choosePriority" value="#{dashboardBean.currentPriority}" label="choosePriority">  
                    <f:selectItem itemLabel="Low Priority" itemValue="1" />  
                    <f:selectItem itemLabel="Medium Priority" itemValue="2" />  
                    <f:selectItem itemLabel="High Priority" itemValue="3" />  
                </p:selectOneMenu>

                <p:commandButton id="submitDialog" icon="ui-icon-check" value="Confirm" ajax='false' type="submit" action="#{dashboardBean.getLastMemo()}"/>
                <p:commandButton icon="ui-icon-close" onclick="dialogMemo.hide();" value="Cancel"/>
            </h:panelGrid>
        </h:form>
    </p:dialog>
    <p:layout fullPage="true">
        <p:layoutUnit id="leftPanel" position="west" size="250" header="My Memos" resizable="false" closable="false" collapsible="false">
            <h:form id="form"> 
                <p:commandButton id="addMemo" icon="ui-icon-plus" onclick="dialogMemo.show();" type="submit" action="#{dashboardBean.getEditControl}"/>  
                <p:dashboard id="dashboardId" model="#{dashboardBean.model}" binding="#{dashboardBean.dashboard}">
                </p:dashboard>  
            </h:form>
        </p:layoutUnit>           
</h:body>

当我点击命令按钮(id =“addMemo”)时,我想将actionListener更改为commandButton(id =“submitDialog”)。

我尝试用:

public void getEditControl()
{
    UIViewRoot view = _context.getViewRoot();
    CommandButton button = (CommandButton) view.findComponent("submitDialog");

    System.out.println("I am ID ==== [ " + button.getId() +" ]");

}

但'button.getId()'不起作用。

2 个答案:

答案 0 :(得分:2)

  

但是'button.getId()'不起作用。

我认为这是因为button实际上是null,因此尝试调用getId()方法会引发NullPointerException?令人惊讶的是你说过这样的问题,“button.getId()不起作用”而不是像“view.findComponent()返回null”那样(这反过来是任何企图访问它会抛出NullPointerException)。如果你确实不知道它为什么抛出NullPointerException,那么我强烈建议先停止JSF并学习基本的Java。


回到具体问题,当组件树中不存在客户端ID findComponent时,null将返回submitDialog。实际上,你将它放在<h:form> NamingContainer组件中。按钮的客户端ID更有可能是formId:submitDialog,其中formId是您必须分配的按钮父表单的ID。找出它的一种简单方法是检查生成的按钮HTML表示的ID。

另请参阅此相关问题:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"只需使用findComponent替换答案中的“ajax”。

答案 1 :(得分:-1)

我不确定你这样做的方式是正确的。 如果你想获得组件实例更好的方法,那就不是通过id得到它而是添加

<p:commandButton id="submitDialog" icon="ui-icon-check" 
value="Confirm" ajax='false' type="submit" 
action="#{dashboardBean.getLastMemo()}" binding="#{dashboardBean.component}" />

这样,bean中的属性将始终具有您需要的组件实例。 请注意,应该查看放置组件绑定的bean的范围,以避免副作用。