User Tools

Site Tools


java:addingcomponentsprogramatically

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:addingcomponentsprogramatically [2013/03/09 00:13]
rlunaro
java:addingcomponentsprogramatically [2014/12/24 10:42] (current)
Line 1: Line 1:
 +====== Adding JSF components programmatically ======
 +
 +I've had to search a lot through internet in order to discover how to create JSF components programmaticaly. At the end, I didn't have to use it in the application I was creating, but I thought it worth to keep the research in some way. 
 +
 +<code java>
 +
 +
 +import javax.faces.application.Application;​
 +import javax.faces.component.html.*;​
 +import javax.faces.context.FacesContext;​
 +
 +import com.rapidoaudit.model.AuditSkel;​
 +
 +
 +public class SectionsCollection
 +{
 + // rendered panel
 + private HtmlPanelGrid grid = null; 
 + //private List<​UIComponent>​ sections;
 + private int sectionsCounter; ​
 +
 + public borrado_20110603_SectionsCollection()
 + {
 + sectionsCounter = 0; 
 + //​sections = new ArrayList<​UIComponent>​();​
 + }
 +
 + public void setComponent( HtmlPanelGrid newGrid )
 + {
 + grid = newGrid;
 + }
 +
 + public HtmlPanelGrid getComponent()
 + {
 + Application app =  FacesContext.getCurrentInstance().getApplication();​
 +
 + grid = (HtmlPanelGrid) app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);​
 + grid.setColumns(1);​
 + grid.setId("​sections"​);​
 +
 + return grid;
 + }
 +
 + public void addSection(AuditSkel skel)
 + {
 +
 + Section s1;
 +
 + skel.addSection();​
 +
 + s1 = new Section(skel,​ sectionsCounter);​
 +
 + grid.getChildren().add( s1.getGrid() );
 +
 + sectionsCounter++; ​
 +
 + } // addSection
 +
 +}
 +
 +
 +</​code>​
 +
 +
 +<code java>
 +package com.rapidoaudit.view;​
 +
 +import javax.el.ELContext;​
 +import javax.el.ValueExpression;​
 +import javax.faces.application.Application;​
 +import javax.faces.component.UIComponent;​
 +import javax.faces.component.UIInput;​
 +import javax.faces.component.UISelectItem;​
 +import javax.faces.component.html.HtmlInputText;​
 +import javax.faces.component.html.HtmlOutputLabel;​
 +import javax.faces.component.html.HtmlOutputText;​
 +import javax.faces.component.html.HtmlPanelGrid;​
 +import javax.faces.component.html.HtmlPanelGroup;​
 +import javax.faces.component.html.HtmlSelectOneMenu;​
 +import javax.faces.component.html.HtmlSelectBooleanCheckbox;​
 +import javax.faces.context.FacesContext;​
 +import javax.faces.convert.IntegerConverter;​
 +
 +import com.rapidoaudit.model.AuditSkel;​
 +
 +import java.util.Random; ​
 +import org.primefaces.component.spinner.Spinner;​
 +
 +public class Section ​
 +{
 +
 + int sectNumber; ​
 +
 + // rendered panel
 + private HtmlPanelGrid grid = null; 
 +
 + public Section( AuditSkel newSkel, int newSectNumber ) 
 + {
 + sectNumber = newSectNumber; ​
 + }
 +
 + public Section()
 + {
 + Random rnd = new Random(); ​
 +  
 + sectNumber = rnd.nextInt( 200000 ); 
 + }
 +
 + public Section( int intSectNumber )
 + {
 + sectNumber = intSectNumber;​
 + }
 +
 +
 + // for setting unique id's in the view
 + private void compSetId( UIComponent comp, String id )
 + {
 + comp.setId( id + new Integer(sectNumber).toString() ); 
 + }
 +
 + // for setting unique id's in the view
 + @SuppressWarnings("​unused"​)
 + private void compSetId( UIComponent comp )
 + {
 + // create a random stream of numbers (just for the sake of keep faces happy)
 + Random rnd = new Random();
 +
 + comp.setId( Integer.toString(rnd.nextInt(200000)));​
 + }
 +
 + /**
 + * To set a value from an Expression Language expression. ​
 + * Example:
 +
 + * compSetValue( name_input, "#​{auditSkel.name}"​ );
 +
 + * where "​auditSkel"​ should be an existent bean
 +
 + * @param comp
 + * @param elExpression
 + */
 + private void compSetValue( UIInput comp, String elExpression )
 + {
 + ELContext elContext = FacesContext.getCurrentInstance().getELContext();​
 +
 + ValueExpression val1 = FacesContext.getCurrentInstance().
 +  ​   getApplication().
 +  ​   getExpressionFactory().
 +  ​   createValueExpression( elContext,
 +  ​   elExpression,​
 +  ​   Object.class);​
 + comp.setValueExpression( "​value",​ val1 );
 +
 + } // compSetValue
 +
 +
 + public HtmlPanelGrid getGrid( )
 + {
 + if( grid == null )
 + {
 + Application app = FacesContext.getCurrentInstance().getApplication();​
 +
 + grid = (HtmlPanelGrid) app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);​
 +
 + grid.setColumns(2);​
 + compSetId( grid, "​Section"​ ); 
 +
 + // <​h:​outputLabel for="​name"​ value="​Name"​ styleClass="​right"/>​
 + HtmlOutputLabel name_label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);​
 + name_label.setStyleClass("​right"​);​
 + name_label.setValue("​Name"​);​
 + name_label.setFor("​type"​);​
 + compSetId( name_label, "​name_label"​ );
 + grid.getChildren().add(name_label);​
 +
 + // <​h:​inputText id="​name"​ value="​Put a name here"/>​
 + HtmlInputText name_input = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE);​
 + compSetId( name_input, "​name_input"​ );
 + // aqui me quedo, no sé cómo se puede hacer esto
 + //​compSetValue( name_input, "#​{auditSkel.getSection("​+ sectNumber +"​).name}"​ );
 + compSetValue( name_input, "#​{testProp.testObject(1).name}"​ ); 
 + grid.getChildren().add(name_input);​
 +
 + //<​h:​outputLabel for="​type"​ value="​Type"​ styleClass="​right"/>​
 + HtmlOutputLabel type_label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); ​
 + type_label.setStyleClass("​right"​);​
 + type_label.setValue("​Type"​);​
 + type_label.setFor("​type"​);​
 + compSetId( type_label, "​type_label"​ );
 + grid.getChildren().add(type_label); ​
 +
 + //<​h:​selectOneMenu id="​type"​ value="​text_many">​
 + //​ <​f:​selectItem itemLabel="​Text"​ itemValue="​text_many"/>​
 + //​ <​f:​selectItem itemLabel="​Date"​ itemValue="​date"/>​
 + //​ <​f:​selectItem itemLabel="​Text (one line)" itemValue="​text_one"/>​
 + //​ <​f:​selectItem itemLabel="​Document"​ itemValue="​file"/>​
 + //​ <​f:​selectItem itemLabel="​Image"​ itemvalue="​image"/>​
 + //</​h:​selectOneMenu>​
 + HtmlSelectOneMenu type_menu = (HtmlSelectOneMenu) app.createComponent(HtmlSelectOneMenu.COMPONENT_TYPE);​
 + compSetId( type_menu, "​type_menu"​ ); 
 + type_menu.setValue("​text_many"​);​
 +
 + UISelectItem type_item_1 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE);​
 + type_item_1.setItemLabel("​Text (many lines)"​);​
 + type_item_1.setItemValue("​text_many"​);​
 + compSetId( type_item_1,​ "​type_item_1"​ );
 + type_menu.getChildren().add(type_item_1);​
 +
 + UISelectItem type_item_2 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); ​
 + type_item_2.setItemLabel("​Date"​);​
 + type_item_2.setItemValue("​date"​);​
 + type_item_2.setId("​type_item_2"​); ​
 + compSetId( type_item_2,​ "​type_item_2"​ );
 + type_menu.getChildren().add(type_item_2);​
 +
 + UISelectItem type_item_3 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); ​
 + type_item_3.setItemLabel("​Text (one line)"​);​
 + type_item_3.setItemValue("​text_one"​);​
 + compSetId( type_item_3,​ "​type_item_3"​); ​
 + type_menu.getChildren().add(type_item_3);​
 +
 + UISelectItem type_item_4 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); ​
 + type_item_4.setItemLabel("​Document"​);​
 + type_item_4.setItemValue("​file"​);​
 + compSetId( type_item_4,​ "​type_item_4"​); ​
 + type_menu.getChildren().add(type_item_4);​
 +
 + UISelectItem type_item_5 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); ​
 + type_item_5.setItemLabel("​Image"​);​
 + type_item_5.setItemValue("​image"​);​
 + compSetId( type_item_5,​ "​type_item_5"​); ​
 + type_menu.getChildren().add(type_item_5);​
 +
 + grid.getChildren().add(type_menu);​
 +
 + //<​h:​outputLabel for="​goesReport"​ value="​Does this section appear on the report?"​ styleClass="​right"/>​
 + HtmlOutputLabel goesReportLabel = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); ​
 + goesReportLabel.setStyleClass("​right"​);​
 + goesReportLabel.setValue("​Does this section appear on the report?"​);​
 + goesReportLabel.setFor("​type"​);​
 + compSetId( goesReportLabel,​ "​goesReportLabel"​ );
 + grid.getChildren().add(goesReportLabel); ​
 +
 + //<​h:​selectBooleanCheckbox id="​goesReport"/>​
 + HtmlSelectBooleanCheckbox goesReport = (HtmlSelectBooleanCheckbox) app.createComponent(HtmlSelectBooleanCheckbox.COMPONENT_TYPE);​
 + compSetId( goesReport, "​goesReport"​ );
 + grid.getChildren().add(goesReport); ​
 +
 + //<​h:​outputLabel for="​isFinding"​ value="​Is this section part of a finding?"​ styleClass="​right"/>​
 + HtmlOutputLabel isFindingLabel = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); ​
 + isFindingLabel.setStyleClass("​right"​);​
 + isFindingLabel.setValue("​Is this section part of a finding?"​); ​
 + isFindingLabel.setFor("​isFinding"​ );
 + compSetId( isFindingLabel,​ "​isFindingLabel"​ ); 
 + grid.getChildren().add(isFindingLabel); ​
 +
 + //<​h:​selectBooleanCheckbox id="​isFinding"/>​
 + HtmlSelectBooleanCheckbox isFinding = (HtmlSelectBooleanCheckbox) app.createComponent(HtmlSelectBooleanCheckbox.COMPONENT_TYPE);​
 + compSetId( isFinding, "​isFinding"​ );
 + grid.getChildren().add(isFinding); ​
 +
 + //<​h:​outputText value="​In each audit work this will appear..."/>​
 + HtmlOutputText minimumMaximum = (HtmlOutputText) app.createComponent( HtmlOutputText.COMPONENT_TYPE );
 + compSetId( minimumMaximum,​ "​minimumMaximum"​ );
 + minimumMaximum.setValue("​In each audit work this will appear..."​);​
 + minimumMaximum.setStyleClass("​right"​);​
 + grid.getChildren().add(minimumMaximum);​
 +
 + HtmlOutputLabel empty1 = (HtmlOutputLabel) app.createComponent( HtmlOutputLabel.COMPONENT_TYPE );
 + compSetId( empty1, "​empty1"​ );
 + empty1.setValue(""​);​
 + grid.getChildren().add(empty1);​
 +
 + //<​h:​panelGrid/>​
 +
 + //<​h:​outputLabel for="​minima"​ value="​...a minimum of" styleClass="​right"/>​
 + HtmlOutputLabel aMinimumOf = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);​
 + compSetId(aMinimumOf,​ "​aMinimumOf"​); ​
 + aMinimumOf.setValue("​A minimum of" ); 
 + aMinimumOf.setStyleClass("​right"​); ​
 + aMinimumOf.setFor("​panelMin"​);​
 + grid.getChildren().add(aMinimumOf);​
 +
 + //<​h:​panelGroup>​
 + HtmlPanelGroup panelMin = (HtmlPanelGroup) app.createComponent(HtmlPanelGroup.COMPONENT_TYPE);​
 + compSetId(panelMin,​ "​panelMin"​);​
 +
 + //​ <​p:​spinner id="​minima"​ value="​1"​ min="​0"​ max="​1000"/>​
 + Spinner spMin = (Spinner) app.createComponent( Spinner.COMPONENT_TYPE ); 
 + compSetId( spMin, "​spMin"​ ); 
 + spMin.setValue(1); ​
 + spMin.setMin(0); ​
 + spMin.setSize(5);​
 + spMin.setMax(1000);​
 + spMin.setConverter(new IntegerConverter());​
 + panelMin.getChildren().add(spMin);​
 +
 + //​ <​h:​outputText value="​times"/>​
 + HtmlOutputText times = (HtmlOutputText) app.createComponent(HtmlOutputText.COMPONENT_TYPE);​
 + compSetId( times, "​times"​ ); 
 + times.setValue("​times"​);​
 + panelMin.getChildren().add(times); ​
 +
 + //</​h:​panelGroup>​
 + grid.getChildren().add(panelMin); ​
 +
 +
 + //<​h:​outputLabel for="​maximum"​ value="​...a maximum of" styleClass="​right"/>​
 + HtmlOutputLabel aMaximumOf = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);​
 + compSetId(aMaximumOf,​ "​aMaximumOf"​); ​
 + aMaximumOf.setValue("​A maximum of" ); 
 + aMaximumOf.setStyleClass("​right"​); ​
 + aMaximumOf.setFor("​panelMin"​);​
 + grid.getChildren().add(aMaximumOf);​
 +
 + //<​h:​panelGroup>​
 + HtmlPanelGroup panelMax = (HtmlPanelGroup) app.createComponent(HtmlPanelGroup.COMPONENT_TYPE);​
 + compSetId(panelMax,​ "​panelMax"​);​
 +
 + //​ <​p:​spinner id="​maximum"​ value="​1"/>​
 + Spinner spMax = (Spinner) app.createComponent( Spinner.COMPONENT_TYPE ); 
 + compSetId( spMax, "​spMax"​ ); 
 + spMax.setValue(1); ​
 + spMax.setMin(0); ​
 + spMax.setSize(5);​
 + spMax.setMax(1000);​
 + spMax.setValue(0);​
 + spMax.setConverter(new IntegerConverter());​
 + panelMax.getChildren().add(spMax);​
 +
 + //​ <​h:​outputText value="​times"/>​
 + HtmlOutputText times2 = (HtmlOutputText) app.createComponent(HtmlOutputText.COMPONENT_TYPE);​
 + compSetId( times2, "​times2"​ ); 
 + times2.setValue("​times"​);​
 + panelMax.getChildren().add(times2); ​
 +
 + //​ </​h:​panelGroup>​
 + grid.getChildren().add(panelMax); ​
 +
 + //</​h:​panelGrid>​
 +
 + }
 +
 + return grid;
 + }
 +
 +}
 +
 +</​code>​
 +
 +~~DISQUS~~
 +
 +
  
java/addingcomponentsprogramatically.txt · Last modified: 2014/12/24 10:42 (external edit)