Java [JSF] Tags (selectItem) in eine Zufällige Reihenfolge bringen

nintendoluk

Commander
Registriert
Mai 2014
Beiträge
2.124
Hi zusammen,

ich ich JSF ein kleines Quiz geschrieben. Die Antwort wird mithilfe von ein paar Checkboxen aus PrimeFaces asugewählt. Das sieht so aus:

HTML:
<p:selectManyCheckbox value="#{quizBean.answerList}" layout="grid"
	columns="1">
	<f:selectItem itemLabel="#{quizBean.quizData.answers[0]}"
		itemValue="0" />
	<f:selectItem itemLabel="#{quizBean.quizData.answers[1]}"
		itemValue="1" />
	<f:selectItem itemLabel="#{quizBean.quizData.answers[2]}"
		itemValue="2" />
</p:selectManyCheckbox>

Wichtig ist hier, dass zu answers[0] auch die itemValue 0 passen muss.

Diese Antwortmöglichkeiten würde ich gerne in eine zufällige Reihenfolge bringen.
Eine Idee wäre, dass ich aus den Answers ein Objekt-Array mache, welches String(itemlabel) und int(itemValue) enthält. Dazu muss ich jedoch sehr viel im Quellcode ändern und das möchte ich deshalb nicht machen.

Kennt ihr eine Andere Möglichkeit? Am besten wäre ein Tag (zB. <x:random> ...selectItem-Tags </x:random>) mit dem ich Tags umschließen kann, sodass diese in eine Zufällige Reihenfolge gebracht werden.

Schonmal Danke :-)

LG Lukas
 
Deine Antwortmöglichkeiten sind so statisch, wie dein Code? Wenn deine Antworten in einer Liste vorliegen, ist f:selectItems das, was du machen willst, nicht f:selectItem.
f:selectItems generiert die Optionen aus einer Liste. Und das die Liste über eine Methode in einer Bean geholt wird, kannst du dort die Reihenfolge bestimmen, wie du willst.

Beispiel:
http://www.javabeat.net/jsf-2-selectmanycheckbox/
 
Würde es irgendwie so machen (Unter der Annahmen, dass deine "quizData" Strings sind):

HTML:
<p:selectManyCheckbox value="#{quizBean.selectedAnswers}" layout="grid" columns="1" >
	<f:selectItems value="#{quizBean.answers}" />
</p:selectManyCheckbox>
Code:
private List<SelectItem> selectedAnswers;

public List<SelectItem> getSelectedAnswers() {
	return selectedAnswers;
}

public void setSelectedAnswers(List<SelectItem> selectedAnswers) {
	this.selectedAnswers = selectedAnswers;
}
	
public List<SelectItem> getAnswers() {
	String[] answers = getQuizData();
	List<SelectItem> result = new ArrayList<SelectItem>();
	for (int i = 0; i < answers.length; i++) {
		result.add(new SelectItem(i, answers[i]));
	}
	// Liste in zufällige Reihenfolge bringen
	return result;
}
 
Das Problem an selectItems ist, dass die itemValue dann der jeweilige String ist.

Das stimmt nicht. Schau dir mal den Konstruktor von SelectItem an, wie ich ihn in meinem Beispiel genutzt habe.

Code:
result.add(new SelectItem(i, answers[i]));

Der erste Parameter ist die itemValue und damit der jeweilige platz in deinem Array.
 
Upps, das ist mir gar nicht aufgefallen ^^

Das sieht toll aus, ich werde es gleich versuchen.

Danke dir!
Ergänzung ()

Nachtrag:

Wie mache ich aus dem "Value" jetzt am besten einen Integer?

Folgendes geht nicht

Code:
answerList[i] = Integer.parseInt((String)selectedAnswers.get(i).getValue());

Code:
answerList[i] = (int)selectedAnswers.get(i).getValue();
Ergänzung ()

Die Exception verwirrt mich etwas:

java.lang.String cannot be cast to javax.faces.model.SelectItem

Sollte es nicht genau andersherum heißen?
Ergänzung ()

Ok ich hab jetzt einfach aus der List<SelectItem> selectedAnswers; einen int[] selectedAnswers; gemacht. Jetzt geht's ^^
 
Zuletzt bearbeitet:
Zurück
Oben