1

我想根据预先选择的图标更改我的命令按钮的 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()”不起作用。

4

2 回答 2

2

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

我认为这是因为button实际上是null,因此调用该方法的尝试getId()抛出了一个NullPointerException? 令人惊讶的是,您这样陈述问题,“button.getId() 不起作用”而不是像“view.findComponent()返回null”(这反过来会导致任何访问它的尝试都会抛出非常明显的后果NullPointerException)。如果您确实不知道它为什么会抛出NullPointerException,那么我强烈建议您暂停 JSF 并先学习基本的 Java。


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

另请参阅此相关问题:How to find out client ID of component for ajax update/render? 找不到从“bar”引用的表达式“foo”的组件只需将答案中的“ajax”替换为findComponent.

于 2013-09-09T01:22:37.830 回答
-1

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

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

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

于 2013-09-09T14:22:34.667 回答