JSF: Checkboxen sollen InputText aktivieren.

Status
Nicht offen für weitere Antworten.

Zasch

Mitglied
Hallo zusammen,

ich plage mich nun schon seit Tagen mit einem einzigen Problem und glaube langsam, dass ich verrückt werde. Ich habe da so ein JSF-Projekt, in dem jeweils nach Klick auf eine BooleanCheckbox das zugehörige InputText-Feld aktiviert werden soll. Im Detail sieht das so aus:

Code:
...
<h:panelGrid border="0" columns="3" styleClass="text">
<h:selectBooleanCheckbox id="abc1" onclick="submit()" 
valueChangeListener="#{InputText.processValueChange}" immediate="true" />
<h:inputText size="10" maxlength="15" disabled="#{InputText.abc1}" />
<h:outputText value="ABC1" />
						
<h:selectBooleanCheckbox id="abc2" immediate="true" onclick="submit()" 
valueChangeListener="#{InputText.processValueChange}" />
<h:inputText size="10" maxlength="15" disabled="#{InputText.abc2}" />
<h:outputText value="ABC2" />
					
<h:selectBooleanCheckbox id="abc3" immediate="true" onclick="submit()" 
valueChangeListener="#{InputText.processValueChange}" />
<h:inputText size="10" maxlength="15" disabled="#{InputText.abc3}" />
<h:outputText value="ABC3" />
						
<h:selectBooleanCheckbox id="abc4" immediate="true" onclick="submit()" 
valueChangeListener="#{InputText.processValueChange}" />
<h:inputText size="10" maxlength="15" disabled="#{InputText.abc4}" />
<h:outputText value="ABC4" />				
</h:panelGrid>
...

und die Bean dazu:

Code:
...
public final class uicomponents implements ValueChangeListener {

	Boolean abc1 = true, abc2 = true, abc3 = true, abc4 = true;
	
	//----- ValueChangeListener -----//
	public void processValueChange(ValueChangeEvent e){
		Boolean x = (Boolean)e.getNewValue();
		String a = e.getComponent().getId();
		
		if (a.compareToIgnoreCase("abc1") == 0){
			setAbc1(!x);
		}
		if (a.compareToIgnoreCase("abc2") == 0){
			setAbc2(!x);
		}
		if (a.compareToIgnoreCase("abc3") == 0){
			setAbc3(!x);
		}
		if (a.compareToIgnoreCase("abc4") == 0){
			setAbc4(!x);
		}
	}
	
	//----- Getter Methods -----//
	public Boolean getAbc1(){
		return abc1;
	}
	
	public Boolean getAbc2(){
		return abc2;
	}
	
	public Boolean getAbc3(){
		return abc3;
	}
	
	public Boolean getAbc4(){
		return abc4;
	}
	
	//----- Setter Methods -----//
	public void setAbc1(Boolean abc1){
		this.abc1 = abc1;
	}

	public void setAbc2(Boolean abc2){
		this.abc2 = abc2;
	}
	
	public void setAbc3(Boolean abc3){
		this.abc3 = abc3;
	}
	
	public void setAbc4(Boolean abc4){
		this.abc4 = abc4;
	}
}

Das Problem daran ist: Wenn ich die erste checkbox anklicke, wird auch das erste inputtextfeld wie erwartet freigegeben. Wenn ich jedoch daraufhin die 2. checkbox anklicke passiert folgendes: die erste checkbox bleibt checked, die zweite ist auch checked, das erste inputtext wird aber wieder disabled und nur das zweite ist aktiv, es sollten aber beide aktiv sein.

Das ganze sieht dann so aus:

jsf.jpg


Ich bin mir ziemlich sicher, dass es nur ein blöder Fehler in der Bean sein kann, aber ich komme einfach nicht drauf (hab mit JSF auch noch nicht so viel Erfahrung). Wäre super, wenn mich da jemand auf den richtigen Pfad bringen, oder mir eine einfach Lösung für das Problem geben könnte.

Danke schonmal im Voraus...
 

Zasch

Mitglied
Da passiert genau das gleiche maki.

Deswegen zweifle ich ja an mir (und ein wenig an meinem Java-Code). Meine Arbeitskollegen sind genauso ratlos und haben schon vorgeschlagen irgendein JavaScript zu schreiben, was das erledigt. Nur wenn es nicht unbedingt sein muß, wollte ich genau das vermeiden.

Ich bin für jede weitere Idee also sehr dankbar!
 
M

maki

Gast
Was du da machst, sieht so aus, als ob du "doppelt moppelst", ein Actionlistener, der die Werte setzt, und dann das noch invers (!abc1... das führt zu verwirrendem Code, der schwer zu verstehen ist.

Versuche doch mal, das ganze einfacher zu lösen.

Damit meine ich, das du nicht in einem ActionListener den Wert der boolean Variablen setzt, sondern direkt deren Wert ausliest ;)

Der Wert der Eigentschaft 'abc1' könnte doch eigentlich automatisch gesetzt werden ;)

In einer Bean:
Code:
...
boolean abc1= false;

public boolean getAbc1() { return abc1; }
public void setAbc1(boolean newValue) { this.abc1= newValue; }
..

In der JSP:
Code:
<h:selectBooleanCheckbox id="abc1" onclick="submit()"
value="#{InputText.abc1}" />
<h:inputText size="10" maxlength="15" disabled="#{not InputText.abc1}" />
<h:outputText value="ABC1" />
Ohne gewähr, habs nicht getestet, könnten also noch Fehler drinnsein ;)
 

Zasch

Mitglied
Hey maki,

schien eine sehr gute Idee zu sein, doch leider sieht es so aus, als würde
Code:
<h:selectBooleanCheckbox value="#{InputText.abc1}" />
auch auf den Getter zugreifen und den Value holen, statt ihn zu setzen.
Ich habe langsam die Befürchtung, als wäre mein Vorhaben in JSF nicht umsetzbar. :?
 
M

maki

Gast
doch leider sieht es so aus, als würde <h:selectBooleanCheckbox value="#{InputText.abc1}" /> auch auf den Getter zugreifen und den Value holen, statt ihn zu setzen.
Eigentlich sollte er beides machen, den getter in der "render response" phase und den setter in der "update model values" phase.

Bekommst du messages?
 
M

maki

Gast
Schmeiss mal alle immediates aus der JSP Seite raus, es ist das am häufigsten Missverstandene feature.
 
G

Guest

Gast
Nur um mein Problem nochmal nach oben zu schubsen...

noch andere Ideen? Ich verzweifel langsam!
 
G

Guest

Gast
hi,

hast du das problem hinbeommen?
ich hab das gleiche!

wäre super wenn du mir noch rückmeldung geben kannst.

gruß
 
G

Guest

Gast
Hi,

ich dachte, es gehen gar keine boolean Werte, außer du schreibst dir einen eigenen Konverter.

Grüße
Sven
 

number8

Aktives Mitglied
Ich habe das ganze mal schnell in netbeans6 kopiert...und...es läuft. habe nur den namen der managedbean geändert. Heißt bei mir "inputs", was aber keinen Einfluss hat (haben sollte)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben