Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build a control programmatically?

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.

like image 447
W_K Avatar asked Jun 08 '12 11:06

W_K


People also ask

How do you add control to a form?

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.

What are controls in C#?

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.


2 Answers

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.

like image 139
Toby Samples Avatar answered Oct 13 '22 05:10

Toby Samples


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

like image 22
Sven Hasselbach Avatar answered Oct 13 '22 05:10

Sven Hasselbach