JSF Textarea nur einblenden, bei bestimmter Auswahl in SelectOneMenu

Headhunter_X

Mitglied
Hallo,

ich versuche gerade mit JSF 1.2 eine Textarea nur einzublenden, wenn in einem SelectOneMenu ein bestimmter Eintrag ausgewählt wurde. Jedoch bekomme ich immer nur eine NullPointerException.
Ich hab raus gefunden, dass er die Textarea-Komponente nicht findet. Weiß einer was zu tun ist?

ValueChangeListener
Java:
public class ValueChangeListeners implements ValueChangeListener
{
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException
    {
        HtmlInputTextarea text = null;
        String i = event.getNewValue().toString();

        List components = event.getComponent().getParent().getChildren();
        for(Iterator iter = components.iterator(); iter.hasNext();)
        {
            UIComponent element = (UIComponent)iter.next();

            if(element.getId().equals("begr_rv"))
            {
                System.out.println("TextArea gefunden!");
                text = (HtmlInputTextarea)element;
            }
        }
            text.setRendered(true);
    }

}


JSF-Seite:
HTML:
<h:form>
<h:selectOneMenu id="decision" style="vertical-align:middle;" value="#{controller.selectedId}" onchange="submit()">
     <f:valueChangeListener type="ValueChangeListeners"></f:valueChangeListener>
          <f:selectItems value="#{controller.options}"></f:selectItems>     </h:selectOneMenu>
<p>
     <h:inputTextarea rendered="false" id="begr_rv" value="#{controller.text}" cols="50" rows="5"></h:inputTextarea>
</p>
</h:form>
 

JimPanse

Bekanntes Mitglied
Versuch es mal mit Komponenten binding:

Java:
public class MyBean{

private HtmlInputTextarea inputText;
public MyBean(){
inputText = new HtmlInputTextarea ();
inputText.setRendered(Boolean.False);
}

public void processValueChange(ValueChangeEvent event) {
inputText.setRendered(Boolean.True);
}

// getter & setter
}

<p>
     <h:inputTextarea  id="begr_rv" value="#{controller.text}" cols="50" rows="5" 
binding="#{controller.inputText}"></h:inputTextarea>
</p>

Greetz
 

Headhunter_X

Mitglied
Hallo,

danke für die Hilfe, mittlerweile läuft es.

Ich hab noch eine weitere Frage, ich versuche gerade bei einer DataTable einzelne Spalten auszublenden.
Das ist unten jetzt nur ein Beispiel.
Er soll die zweite Column nur anzeigen, wenn die Stadt aus der DB Hamburg ist.
Nur blendet er die Spalte immer aus, egal ob die Bedingung stimmt oder nicht.

Kann mir da einer einen Tipp geben.

HTML:
<h:dataTable  var="data" value="#{controller.alleStaedte}">
                                        <h:column>
                                            <f:facet name="header">
                                                <h:outputText styleClass="col4" value="nr"/>
                                            </f:facet>
                                            <h:outputText value="#{data.id}"></h:outputText>
                                        </h:column>
                                        <h:column rendered = "#{data.stadt == 'hamburg'}">
                                            <f:facet name="header">
                                                <h:outputText value="stadt"/>
                                            </f:facet>
                                            <h:outputText value="#{data.stadt}"></h:outputText>
                                        </h:column>
</h:dataTable>
 

Nogothrim

Aktives Mitglied
Stringvergleiche mit "==" sind generell keine gute Idee, wenn es sich bei 'hamburg' um einen String handeln sollte, versuch mal "eq" statt "==" zu verwenden.
 

Fant

Bekanntes Mitglied
Was du vorhast erscheint mir wenig sinnvoll, habe es aber selbst nicht getestet. In data hast du doch eine Liste oder eine vergleichbare Datenstruktur. Anhand welches der darin enthaltenen Datensätze soll denn nun entschieden werden, ob die gesamte Tabellenspalte gerendert werden soll?

Wenn du für jede Zeile entscheiden willst, ob dort der Inhalt der Spalte gerendert werden soll, dann gehört das render-Attribut in das <h:eek:utputText>-Tag.

Wenn du es wirklich für die ganze Spalte entscheiden möchtest, dann stellt sich mir immer noch die Frage, wann diese denn nun wirklich dargestellt werden soll (siehe oben). Wenn die boolschen Ausdrücke an so einer Stelle etwas unübersichtlich werden, oder evtl nicht das wünschen, was man erwartet, dann greife ich oft darauf zurück die Auswertung des Ausdrucks in die backingBean zu verlagern. Einfach eine Methode
Java:
public boolean getRenderDatatableIdColumnId() { ... }
erstellen, und dann auf der jsf-Seite nur noch
HTML:
<h:column rendered = "#{bean.renderDatatableIdColumnId}">
schreiben.

Gruß Fant
 
Zuletzt bearbeitet:

Headhunter_X

Mitglied
Hallo,

danke für den Tipp.
Ich hatte es erst versucht, ohne zusätzliche Methoden umzusetzen und nicht wie in deinem Beispiel.
Jetzt hab ich mir wie von dir vorgeschlagen, die passende Methode dazu angelegt, die prüft, ob in der Liste eine bestimmte Stadt vorkommt und dann die gewollte Spalte rendert.
 

Ähnliche Java Themen

Neue Themen


Oben