!!!Skinning {{{ <context-param> <param-name>org.richfaces.enableControlSkinning</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.richfaces.enableControlSkinningClasses</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.richfaces.skin</param-name> <param-value>blueSky</param-value> </context-param> }}} !!!Tree Um die Selection-Events zu bekommen, sind einige Dinge zu beachten: * Der Tree muss sich in einem Form-Tag befinden * Das selectionChangeListener-Attribut funktioniert nicht, es muss ein zusätzlicher Tag rich:treeSelectionChangeListener verwendet werden * Die Keys der TreeNodes können Probleme bereiten, wenn es Integers sind oder Sonderzeichen enthalten {{{ <h:form id="tree-form"> <rich:tree id="tree" value="#{bean.tree}" selectionType="ajax"> <rich:treeSelectionChangeListener listener="#{bean.changeSelection}"/> <rich:treeNode> <h:outputText value="#{node.name}"/> </rich:treeNode> </rich:tree> </h:form> }}} {{{ public void changeSelection(TreeSelectionChangeEvent event) { System.out.println("Selection changed: " + event.getNewSelection()); } }}} !!!Fixes !!Collapsible Sub-Table In Firefox kommt die Meldung "TypeError: RichFaces.ui.CollapsibleSubTable is not a constructor", im Internet-Explorer kommt es zu nicht lokalisierenden Javascript-Fehlern. Ursache sind fehlende Resourcen, der Fix besteht im manuellen Einbinden: {{{ <h:outputScript name="collapsible-subtable.js" library="org.richfaces"/> <h:outputStylesheet name="collapsible-subtable.ecss" library="org.richfaces"/> }}} !!AJAX-Errors Richfaces verbiegt das AJAX-Framework von JSF, vor allem um seinen mehr oder weniger nützlichen AJAX-Queue zu implementieren. Dabei entstehen gravierende Nebenwirkungen, wie zum Beispiel dass keine AJAX-Requests mehr mit einer DOM-Element-Id abgeschickt werden können, nur noch mit dem DOM-Element selbst. Ein anderes Problem ist das Verschlucken von AJAX-Fehlermeldungen. Richfaces registriert mit jsf.ajax.addOnError(onError) einen eigenen Error-Handler, in dessen Code dann steht "//TODO: what if somebody is going to clear queue on error?". Abhilfe schafft das Registrieren eines weiteren Error-Handlers mit einer sinnvollen Ausgabe: {{{ <c:if test="#{facesContext.application.projectStage == 'Development'}"> <script type="text/javascript"> jsf.ajax.addOnError(function (data) { alert(data.description); }); </script> </c:if> }}}