Rich:tabPanel generisch füllen?

RoCMe

Erfahrenes Mitglied
Hi!

Ich hab so meine liebe Not mit den RichFaces Komponenten...

Folgendes Szenario: In einer Bean habe ich eine Liste von Objekten, jedes davon soll einen eigenen Tab bekommen. Von der Theorie doch ganz einfach: TabPanel auf, Schleife rein und in die Schleife jeweils ein Tab erzeugen. Etwa so:

Code:
<rich:tabPanel switchType="client" id="tabs">
<ui:repeat value="#{bean.Liste}" var="element">
<rich:tab label="#{element.name}">
...
</rich:tab>
</ui:repeat>
</element>
</rich:tabPanel>

Soweit sieht das doch gut aus - zumindest in der Theorie. Praktisch umgesetzt führt das dazu, dass gar nichts angezeigt wird. Lediglich die Ausgabe
"2010-02-26 16:58:34.301:INFO:project:a4j_form:msgDetails: tab panel has no enabled or rendered tabs!"
weist darauf hin, dass irgendwas schief läuft.
Testweise das repeat um den gesamten Panel, und schwupps: Ich sehe 2 korrekt dargestellte, korrekt benannte (!) Tabs - nur leider einzeln in einen Panel verpackt, hilft mir also nicht wirklich.
Nun denn, ich bin ja schon groß und kann schon ganz alleine googeln! Und siehe da: "Nimm c:forEach statt ui:repeat". Auch gut! Also die Schleife wieder nur um die Tabs rum und umbenannt (statt "ui:repeat" ein "c:forEach", statt value heißt es nun items, der Rest bleibt wie er ist!). Ganz toll: Immerhin sehe ich jetzt einen (!) Tab, aber der hat nicht mal ein Label bekommen! Zugriffe auf das 'element' werden anscheinend ignoriert, aber Werte aus der Bean (z.B. "#{bean.getSimpleString}") werden korrekt ausgewertet.

Noch mal zusammengefasst: ui:repeat klappt nicht innerhalb des TabPanels, und das forEach scheint auch nicht korrekt zu sein. Was mache ich falsch?

Thx, Gruß,

RoCMe
 
Ich noch mal:

Fast scheint es, als wäre ich für die Verwendung von c:forEach generell zu doof, liefert doch auch dieses aus dem Web kopierte einfache Beispiel nur ein einziges Hallo - und sonst nichts weiter :-(

Code:
<table>
	<c:forEach var="i" begin="1" end="10">
	  <tr>
	    <td>Hallo</td>
	  </tr>
	</c:forEach>
</table>
</c:forEach>

Was mache ich falsch?

EDIT: XHTML ein wenig formatiert :)
 
Hi,

ich verfolge bei so etwas einen anderen Ansatz. Wird hier in einem Blog beschrieben, nicht meiner ;)

Der Code im xhtml/jsp ist dann recht rudimentär
HTML:
<f:view>
	<h:form id="form_dynamic_tabs">
		<rich:tabPanel id="panel_tab" binding="#{dynamicTab.tabPanel}">
		</rich:tabPanel>
	</h:form>
</f:view>

Das dynamische erzeugen ist in die Backing Bean verlagert. Die sollte dann am besten nicht im Request Scope stecken.
Java:
package de.sentoo.jsf.dynamictab;

// imports ...

public class DynamicTab {

	private HtmlTabPanel tabPanel;
	
	public DynamicTab() {
		super();
		FacesContext tmpContext = FacesContext.getCurrentInstance();
		Application tmpApplication = tmpContext.getApplication();	
		tabPanel = (HtmlTabPanel)tmpApplication
			.createComponent(HtmlTabPanel.COMPONENT_TYPE);
		createDynamicTabs(tmpApplication);
	}

	private void createDynamicTabs(Application aApplication) {
		for(int i=1; i<5;i++) {
			HtmlTab tmpTab = (HtmlTab)aApplication
				.createComponent(HtmlTab.COMPONENT_TYPE);
			String tmpLabel = "Dynamic Panel #" + String.valueOf(i);
			tmpTab.setLabel(tmpLabel);
			String tmpId = "dynamic_panel_" + String.valueOf(i);
			tmpTab.setId(tmpId);
			tabPanel.getChildren().add(tmpTab);
		}
	}
	
	public HtmlTabPanel getTabPanel() {
		return tabPanel;
	}

	public void setTabPanel(HtmlTabPanel aTabPanel) {
		this.tabPanel = aTabPanel;
	}
}

Edit #1:
Ach ja, ich habe gar nicht geschrieben, warum ich das mache :)
http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets
http://drewdev.blogspot.com/2008/08/cforeach-with-jsf-could-ruin-your-day.html

Es funktioniert leider nicht immer.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück