Mam problemy z komponentem niestandardowym, który piszę, ponieważ nie wyrenderuje żadnych zagnieżdżonych elementów sterujących. Komponent to prosta kontrola układu, bardzo luźno zaadaptowana z formantu ApplicationLayout w bibliotece rozszerzeń. Kod XPage wygląda następująco:Komponent niestandardowy nie wyświetla zagnieżdżonych komponentów
<px:exampleControl id="exampleControl1">
<xp:span styleClass="mySpan">Inner Text</xp:span>
</px:exampleControl>
exampleControl odda w porządku, ale zagnieżdżone rozpiętość nie będzie. Mój podstawowy kod renderujący jest:
public class ExampleRenderer extends Renderer {
@Override
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.startElement("div", component);
writer.writeAttribute("class", "custom-banner", null);
writer.endElement("div");
writer.startElement("div", component);
writer.writeAttribute("class", "main-body", null);
}
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeChildren(FacesContext context, UIComponent component) {
try {
super.encodeChildren(context, component);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.endElement("div");
writer.startElement("div", component);
writer.writeAttribute("class", "custom-footer", null);
writer.endElement("div");
}
}
Mam nawet próbował użyć konkretnej funkcji renderowania pożyczoną od renderujących Extension Library (funkcje użytkowe w AbstractApplicationLayoutRenderer.java) ale component.getChildCount() zawsze zwraca 0.
Dlaczego więc zagnieżdżone kontrolki nie wyświetlają, a czego mi brakuje?
Czy sprawdziłeś Renderer.encodeChildren? AFAIK to nic nie robi - dlatego trzeba go zastąpić, więc połączenie z "super" nic nie robi. Przynajmniej musisz ustawić rendersChildren [na true] (http://docs.oracle.com/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.1_01/docs/api/javax/faces/render/Renderer.html#encodeChildren % 28javax.faces.context.FacesContext,% 20javax.faces.component.UIComponent% 29) – stwissel