I have custom control written in Java. For the sake of simplicity lets assume that it looks like this:
public class HelloworldControl extends UIComponentBase {
@Override
public void decode(FacesContext context) {
String cid = this.getClientId(context);
...
super.decode(context);
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.writeText("Hello world!", this);
// I want a view!!
}
@Override
public void encodeEnd(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
...
}
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[]) state;
...
super.restoreState(context, values[0]);
}
public Object saveState(FacesContext context) {
Object values[] = ...
}
}
I would like to add programatically child control to it. For example I would like a child view control to render a view just under the Hellow world text.
How can i do this? What is the standard procedure to build dynamically a control?
To put it simply - I want programmatically build a hierarchy of standard components and I want to attach it to my control.
Add the control by drawingSelect the control by clicking on it. In your form, drag-select a region. The control will be placed to fit the size of the region you selected.
C# Control Windows Forms controls are reusable components that encapsulate user interface functionality and are used in client-side Windows applications. A button is a control, which is an interactive component that enables users to communicate with an application.
The answer I think your looking for is implement the FacesComponent Interface There is detailed instructions that Keith Strickland put out on his blog:
http://xprentice.gbs.com/A55BAC/keithstric.nsf/default.xsp?documentId=82770C11FA7B9B21852579C100581766
It uses the initBeforeContents, buildContents, and initAfterContents methods to allow you to add children.
Hope that helps.
You could do this by creating your UIComponent directly in your encodeBegin method:
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.writeText("Hello world!", "");
try{
UIPassThroughText uiText= new UIPassThroughText();
uiText.setText("Hello daddy!");
uiText.encodeBegin(context);
uiText.encodeChildren(context);
uiText.encodeEnd(context);
}
But I don't think that it is a good idea to do this, because then your child components are not added to the component tree...
EDIT: The answer of Toby Samples is the better one. I have undeleted this answer because it still works, but I am not proud of. To add the uiText to the component tree, you would have to use the this.getChildren().add(uiText) method.
Better to use an own renderer class as described f.e. here: XPages Extensibility API > Creating a Java Control in an NSF
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With