Set controls value to objects in array
oneworld95 Jul 24, 2009 5:11 PMI've got a page that needs to have controls added to it dynamically. An HtmlPanel on the page is bound to the manager class -- CustomCalendarHandler.
Each time the user clicks the "Add Another Calendar" button, the manager class fires off the addComponent() method on the CustomCalendar, which adds a RichCalendar and HtmlInputText to the panel on the page. It stores that particular CustomCalendar in an ArrayList.
How do I set the Value of each calendar and textbox to Date and String properties of their respective CustomCalendar object in the ArrayList? When I try this code, it throws an exception:
javax.faces.convert.ConverterException: value must be a date
Here's the code for the CustomCalendar class:
import org.ajax4jsf.component.html.HtmlAjaxSupport; import org.richfaces.component.html.HtmlCalendar; import javax.el.ValueExpression; import javax.faces.component.html.HtmlInputText; import javax.faces.component.html.HtmlOutputLabel; import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; import org.richfaces.component.html.HtmlPanel; import org.richfaces.component.html.HtmlRichMessage; import org.ajax4jsf.component.html.HtmlAjaxOutputPanel; import java.util.Date; public class CustomCalendar { private HtmlCalendar calendarInput; private HtmlInputText hoursInput; private HtmlOutputLabel label; private HtmlOutputText text1; private HtmlOutputText text2; private HtmlPanel htmlPanel; private Integer componentCount; private HtmlAjaxSupport ajaxSupport; private HtmlRichMessage message; private HtmlAjaxOutputPanel ajaxPanel; private Integer componentId; private Date date; private String hours; public CustomCalendar(){ if (this.componentCount == null || this.componentCount == 0){ this.addComponent(); } } public void addComponent(){ if (this.componentCount == null) return; componentId = componentCount; StringBuilder el = new StringBuilder(); String calId = "calOvertimeDate_" + Integer.toString(componentCount); String txtId = "txtOvertimeHours_" + Integer.toString(componentCount); calendarInput = new HtmlCalendar(); message = new HtmlRichMessage(); hoursInput = new HtmlInputText(); label = new HtmlOutputLabel(); text1 = new HtmlOutputText(); text2 = new HtmlOutputText(); ajaxSupport = new HtmlAjaxSupport(); ajaxPanel = new HtmlAjaxOutputPanel(); ajaxPanel.setId("renderPanel"); ajaxPanel.setAjaxRendered(true); calendarInput.setValue("#{CustomCalendarHandler.components.get(" + Integer.toString(componentId) + ").getDate()}"); calendarInput.setDatePattern("MM-dd-yyyy"); calendarInput.setId(calId); message.setFor(txtId); message.setStyleClass("errors"); el.append("#{CustomCalendarHandler.components.get("); el.append(Integer.toString(componentId)); el.append(").getDate() == null || "); el.append("CustomCalendarHandler.components.get("); el.append(Integer.toString(componentId)); el.append(").getDate().toString() == '' ? false : true}"); ajaxSupport.setEvent("oninputblur"); ajaxSupport.setReRender("renderPanel"); ajaxSupport.setAjaxSingle(true); calendarInput.getFacets().put("a4jsupport", ajaxSupport); hoursInput.setId(txtId); hoursInput.setMaxlength(5); hoursInput.setValue("#{CustomCalendarHandler.components.get(" + Integer.toString(componentId) + ").hours}"); hoursInput.setRequiredMessage("If you provide a value for Date " + Integer.toString(componentCount) + ", you must provide the OT Hours."); FacesContext ctx = FacesContext.getCurrentInstance(); ValueExpression ve = ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(),el.toString(), Boolean.class); hoursInput.setValueExpression("required", ve); label.setValue("Date " + Integer.toString(componentCount)); text1.setValue("  OT Hours"); text1.setEscape(false); text2.setValue("<br />"); text2.setEscape(false); htmlPanel.getChildren().add(label); htmlPanel.getChildren().add(calendarInput); htmlPanel.getChildren().add(text1); ajaxPanel.getChildren().add(message); ajaxPanel.getChildren().add(hoursInput); htmlPanel.getChildren().add(ajaxPanel); htmlPanel.getChildren().add(text2); } public Date getDate(){ return this.date; } public void setDate(Date date){ this.date = date; } public String getHours(){ return this.hours; } public void setHours(String hours){ this.hours = hours; } public Integer getComponentId(){ return this.componentId; } public void setComponentId(Integer componentId){ this.componentId = componentId; } public Integer getComponentCount(){ return this.componentCount; } public void setComponentCount(Integer componentCount){ this.componentCount = componentCount; } public HtmlPanel getPanel(){ return this.htmlPanel; } public void setPanel(HtmlPanel htmlPanel){ this.htmlPanel = htmlPanel; } public HtmlCalendar getCalendarInput(){ return this.calendarInput; } public void setCalendarInput(HtmlCalendar calendarInput){ this.calendarInput = calendarInput; } public HtmlInputText getHoursInput(){ return this.hoursInput; } public void setHoursInput(HtmlInputText hoursInput){ this.hoursInput = hoursInput; } }
Here's the code for the manager class:
import java.util.ArrayList; import org.richfaces.component.html.HtmlPanel; public class CustomCalendarHandler { private ArrayList<CustomCalendar> components; private HtmlPanel htmlPanel; private Integer componentCount; public CustomCalendarHandler() { components = new ArrayList<CustomCalendar>(); componentCount = 0; if (htmlPanel == null){ htmlPanel = new HtmlPanel(); } this.addCustomCalendar(); } public void addCustomCalendar(){ componentCount = (componentCount == null) ? 0 : componentCount + 1; CustomCalendar customCalendar = new CustomCalendar(); customCalendar.setPanel(htmlPanel); customCalendar.setComponentCount(componentCount); customCalendar.addComponent(); components.add(customCalendar); } public HtmlPanel getPanel(){ return this.htmlPanel; } public void setPanel(HtmlPanel htmlPanel){ this.htmlPanel = htmlPanel; } public ArrayList<CustomCalendar> getComponents(){ return this.components; } public void setComponents(ArrayList<CustomCalendar> components){ this.components = components; } }
Here's the pertinent XHTML:
<rich:panel id="calPanel" binding="#{CustomCalendarHandler.panel}"/> <a4j:commandButton action="#{CustomCalendarHandler.addCustomCalendar()}" value="Add Another Calendar" reRender="calPanel" />