selectOneMenu NullPointer

Hi…

Also ich versuche gerade irgendwie mit AJAX klar zu kommen.
Ich habe 3 DropDown Menüs

<h:form>
            <h:selectOneMenu value="#{userKal.selectedDay}">
                <f:selectItems value="#{userKal.days}" />
            </h:selectOneMenu>
            <h:selectOneMenu value="#{userKal.selectedMonthString}">
                <f:selectItems value="#{userKal.months}"/>
            </h:selectOneMenu>
            <h:selectOneMenu value="#{userKal.selectedYear}">
                <f:selectItems value="#{userKal.years}"/>
            </h:selectOneMenu>
        </h:form>

Ich finde über Google immer nur Anwendungen in denen durch den Button eine Veränderung hervorgerufen wird.
Es müsste doch eigentlich möglich sein, dass die einzelnen Menüs sich gegenseitig beeinflussen, oder?

Wäre wirklich mehr als dankbar für Hilfe.

Das geht mit
[xml]<f:ajax event=“change” execute="@this" render="…" />[/xml]

Schonmal danke dafür…

nur…was machen die Einzelnen Teile? :frowning:

Ganz platt:
[ul]
[li]Event beschreibt das Event, dass die umgebene Komponente wirft und die Ajax-Komponente verarbeiten soll.
[/li][li]execute="@this" sagt, dass nicht die komplette Form, sondern nur die umgebene Komponente an den Server übertragen werden soll.
[/li][*]render erwartet die id der Komponente, die neu gezeichnet werden soll, nachdem der Submit durchgeführt wurde.[/ul]

Gilt in diesem Fall auch ein Ändern der Auswahl als Submit?
Da es ja mein Ziel wäre, die Tage neu zu zeichnen, wenn der Moant geändert wird.

ja

Also…

Nur um zu prüfen, ob ich das richtig verstanden habe, weil ich von JSF an sich nicht sonderlich viel Ahnung habe und es auch nicht funktioniert:

<f:ajax event="change" execute="@this" render="day"/>

Das gibt an, dass das SelectOneMenu mit der id “day” nochmal gerendert wird. In diesem Fall wird also erneut die

public ArrayList<Integer> getDays() {
        ChangeMonth();
        setDays();
        return days;
}

aufgerufen?

ja (du kannst es aber auch einfach ausprobieren. :))

Ich habe es ja versucht, bevor ich das geschrieben habe…es hat nur nicht funktioniert weswegen ich versucht habe den Fehler zu finden…
Wenn ich das aber so richtig verstanden habe bin ich wieder an Punkt null mit meiner Fehlersuche :frowning:

Wir können aber nur helfen, wenn Du mehr Code postest und die Fehlerbeschreibung genauer definierst. Sonst kann man nur in der Glaskugel lesen - und das hilft selten. :slight_smile:

Es ist kein Fehler an sich, sonst hätte ich ihn dann doch angefügt.
Es funktioniert nur einfach nicht…
Es werden immer nur 31 Tage angezeigt (wahrscheinlich weil August ist und der für gewöhnlich 31 Tage hat).


<h:selectOneMenu id="day" value="#{userKal.selectedDay}">
    <f:selectItems value="#{userKal.days}" />
    <f:ajax event="change" execute="@this"/>
</h:selectOneMenu>
<h:selectOneMenu id="month" value="#{userKal.selectedMonthString}">
    <f:selectItems value="#{userKal.months}"/>
    <f:ajax event="change" execute="@this" render="day"/>
</h:selectOneMenu>
<h:selectOneMenu id="year" value="#{userKal.selectedYear}">
    <f:selectItems value="#{userKal.years}"/>
    <f:ajax event="change" execute="@this" render="month"/>
</h:selectOneMenu>

Hast Du das mal debugged? Werden die Getter und Setter auch aufgerufen? Wenn ja, dann auch in der richtigen Reihenfolge?

Ich habe es versucht zu debuggen…aber mit dem Webprojekt bekomme ich das nie hin.
im JSF kann ich keine Breakpoints setzen und in der Methode macht er nichts…Ich weiß nicht,ob er dann gar nicht reingeht…
Müssen die Getter und Setter nicht aufgerufen werden, wenn die Variablen private sind?

EDIT:
Warum auch immer funktioniert der Debugger jetzt. (zum Debugger: Ich habe gestern mehrfach erfolglos versucht anzuwerfen)
Er verwendet auch sehr gut die Bean. Ruft außerdem auch die richtigen Methoden auf.
Die Bean bekommt die Veränderung mit. Nur die Tagesanzahl ändert sich nicht.
Die Methode wird nicht nochmal aufgerufen, obwohl die Tage des Monats neu gesetzt werden.
ArrayList days enthält dann 28 Tage…angezeigt werden aber immernoch 31.

Wird der Getter für die Tage dann auch aufgerufen? Wenn nicht, liegt es vermutlich an der Id.

Du könntest mal ein render="@form" ausprobieren. Wenn das klappt, dann liegt es an der ID. Ich vermute ein render=":form:day" wird dann helfen.

Getter der Tage wird nur beim ersten Erstellen aufgerufen, danach nicht mehr.

auch mit render="@form" oder render=":form:day" funktioniert es leider nicht, die Tage bleiben 31.

Zeig mal bitte die gesamte xhtml-Seite? Hast Du da eine Form drin?

Es ist alles in einem Form drin


<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <meta http-equiv="refresh" content="1, URL=localhost:8080/19191/faces/index.xhtml"/> 
    <h:head>
        <title>Kalender</title>
    </h:head>
    <h:body>
        Hello #{userLogin.user}.
        <br/>
        <h:form id="form">
            <h:selectOneMenu id="day" value="#{userKal.selectedDay}">
                <f:selectItems value="#{userKal.days}" />
                <f:ajax event="change" execute="@this" />
            </h:selectOneMenu>
            <h:selectOneMenu id="month" value="#{userKal.selectedMonthString}">
                <f:selectItems value="#{userKal.months}"/>
                <f:ajax event="change" execute="@this" render="@form"/>
            </h:selectOneMenu>
            <h:selectOneMenu id="year" value="#{userKal.selectedYear}">
                <f:selectItems value="#{userKal.years}"/>
                <f:ajax event="change" execute="@this" render="@form"/>
            </h:selectOneMenu>
            <br/>
            <h:commandButton value="Termine ansehen" action="show" />
            <c:if test="#{(userLogin.user) == 'admin'}">
                <h:commandButton value="edit" action="edit" />
            </c:if>
        </h:form>
 </h:body>
</html>

Ich sehe da jetzt keinen Fehler. Sind die Felder alle Strings?

days und years sind Integer ArrayLists
months ist ein String Array

Dann benötigst Du dort einen Converter.

Entweder so:

[xml]<h:selectOneMenu …>
<f:convertNumber integerOnly=“true” />
</h:selectOneMenu>[/xml]

oder so

[xml]<h:selectOneMenu converter=“javax.faces.Integer”/>[/xml]