0

(注文)アイテムを表示するdatgridを備えた小さなjsf/primefacesアプリケーションがあります。ダイアログ中にアイテムを追加したいと思います。

  1. ボタンをクリックしてダイアログを開きます。-作品
  2. ダイアログから Bean に値を送信し、データグリッドを更新したいと考えています。(ダイアログからではなく)デフォルト値を使用すると、機能します。項目がデータグリッドに表示され、ダイアログが閉じます。つまり。-addItem 関数の動作 -更新の動作

しかし、ダイアログから値を追加したい場合は、null ポインター例外が発生します。したがって、私の値は Bean に設定されません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <p:fieldset legend="Positionen" toggleable="true" toggleSpeed="500" styleClass="mbsFieldSet">
        <h:form id="form_positions">

        <p:growl id="messages" showDetail="true" /> 
        <!-- Add position mask -->

        <!-- Button to open the open position mask -->
        <p:commandButton id="btOpenAddPositionMask" value="Position via Dialog" onclick="dlg.show();">
        </p:commandButton>

        <p:dataTable var="banfPosition" value="#{banfPositionBean.lsBanfPositions}"
            id="tableBanfPositions" editable="true" >
            <f:facet name="header">Positionen</f:facet>

            <!-- AJAX Events for editing position values -->
            <p:ajax event="rowEdit" listener="#{banfPositionBean.onEdit}"
                update=":form_positions:messages"/>

            <p:ajax event="rowEditCancel" listener="#{banfPositionBean.onCancel}"
                update=":form_positions:tableBanfPositions"  />


            <p:column headerText="Menge" style="width:50px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.amount}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.amount}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Matr. / Lager-Nr." style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.stockNumber}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.stockNumber}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Artikel" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.article}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.article}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>


            <p:column headerText="Preis/Einheit" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.price}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.price}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Gesamtpreis" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.sum}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.sum}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Etat-Nr" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.etat}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.etat}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Anlagen-Nr" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.complex}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.complex}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Ändern" style="width:20px; text-align:center">
                <p:rowEditor />
            </p:column>
            <p:column headerText="Löschen" style="width:20px; text-align:center" >
                <p:commandButton id="deletePos" actionListener="#{banfPositionBean.deletePos(banfPosition)}" 
                 update=":form_positions:tableBanfPositions" ajax="true" icon="ui-icon ui-icon-close" iconPos="center"
                title="Löscht den Eintrag in dieser Zeile." />
            </p:column>
        </p:dataTable>


        </h:form>
    </p:fieldset>

    <p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false">
        <h:panelGrid columns="2" style="margin-bottom:10px">

                <h:outputLabel value="Artikel:" />
                <p:selectOneMenu id="selectArticleForPosition"
                    value="#{banfPositionBean.selectedArticle}" var="art"
                    panelStyle="width:150px" style="width:260px" effect="fade"
                    filterMatchMode="starts" filter="true">
                    <f:selectItems value="#{dataBean.lsArticle}" var="article"
                        itemLabel="#{article.name}" itemValue="#{article}" />
                    <p:column>
                #{art.id} - #{art.name}
            </p:column>
                </p:selectOneMenu>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                ajax="true" process="@all" type="submit">
            </p:commandButton>

    </p:dialog>
</ui:composition>

http://www.primefaces.org/showcase/ui/dialogForm.jsfに示されているように、h:form-Tag で試してみますが、これを追加すると。

<p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false">
        <h:form id="form_dialog">
        <h:panelGrid columns="2" style="margin-bottom:10px">

                <h:outputLabel value="Artikel:" />
                <p:selectOneMenu id="selectArticleForPosition"
                    value="#{banfPositionBean.selectedArticle}" var="art"
                    panelStyle="width:150px" style="width:260px" effect="fade"
                    filterMatchMode="starts" filter="true">
                    <f:selectItems value="#{dataBean.lsArticle}" var="article"
                        itemLabel="#{article.name}" itemValue="#{article}" />
                    <p:column>
                #{art.id} - #{art.name}
            </p:column>
                </p:selectOneMenu>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                ajax="true" process="@all" type="submit">
            </p:commandButton>
            </h:form>
    </p:dialog>

ページはリロードされますが、Bean も呼び出されません。

誰かが私が間違っていることを知っていますか? 手伝ってくれてありがとう。

------------------------------------------- *編集* ---- ------------------------------------------------------

selectOneMenu の代わりに p:inputText を使用して試してみると、Bean が呼び出されます。

<p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false" appendToBody="true">
        <h:form id="form_dialog">
        <h:panelGrid columns="2" style="margin-bottom:10px">
                <h:outputLabel for="inputTxt" value="Artikel:" />
                <p:inputText id="inputTxt" value="#{banfPositionBean.testStr}"></p:inputText>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();">
            </p:commandButton>
        </h:form>
    </p:dialog>

したがって、selectOneMenu で機能しない理由を見つける必要があります。

4

1 に答える 1