Did you ensure that you
1) set all the Ids of your programmatically created components
2) have a setPanelGrid (used for the binding after page reload i think,
i have never used the binding attribute however, my experience is
limited to composite components)
3) set all required properties for corresponding tags (that is if tag
for component X requires property y, ensure there is a setValue(Y,...)
in your code)
4) it still fails with only 1 binding, and no nested panelGrid.
Ulrich Teichert a écrit :
> Hi,
>
>
>> This is i think your mistake:
>>
>> _tabbedPane = new HtmlPanelTabbedPane();
>> _tab = new HtmlPanelTab();
>>
>> Never construct an UIComponent directly. It's lifecycle has to be
>> managed by the JSF engine for things to work properly. If you need to
>> create compoment using java code, use the application, like this:
>>
>> Application application =
>> FacesContext.getCurrentInstance().getApplication();
>> _tabbedPane =
>> (HtmlPanelTabbedPane)application.createComponent(HtmlPanelTabbedPane.COMPONENT_TYPE);
>>
>
> OK, makes sense, esp. because I already did that in other places.
> So, I changed the code to:
>
> public HtmlPanelTabbedPane getTabbedPane() {
> if (_tabbedPane == null) {
> Application app = FacesContext.getCurrentInstance().getApplication();
> _tabbedPane =
> (HtmlPanelTabbedPane)app.createComponent(HtmlPanelTabbedPane.COMPONENT_TYPE);
> _tab = (HtmlPanelTab)app.createComponent(HtmlPanelTab.COMPONENT_TYPE);
> _tab.setLabel("Blah");
> _tab.setId("PanelTab");
> _tabbedPane.getChildren().add(_tab);
> _tree = (HtmlTree)app.createComponent(HtmlTree.COMPONENT_TYPE);
> ....
>
> But the behaviour did not change :-( Anything else suspicious?
>
> TIA,
> Uli
>
>
>> Ulrich Teichert a écrit :
>>
>>> Hi,
>>>
>>>
>>>
>>>> Could you provide us with a sampel code of how you create your
>>>> UIComponent?
>>>>
>>>>
>>> Sure, I should have done that from the start. I also forgot to list
>>> some vital version numbers - which proves that I couldn't really
>>> think anymore yesterday evening...
>>>
>>> Anyway, I am using java 1.5 in a Linux environment, tomcat 5.0.28,
>>> myfaces 1.1.5-SNAPSHOT, tomahawk-1.1.5-SNAPSHOT, spring 2.0RC1 and
>>> tons of other stuff which is probably not that important.
>>>
>>> I'm creating my HtmlPanelTabbedPane on the fly in the get-method of
>>> my bean, like this:
>>>
>>> public HtmlPanelTabbedPane getTabbedPane() {
>>> if (_tabbedPane == null) {
>>> _tabbedPane = new HtmlPanelTabbedPane();
>>> _tab = new HtmlPanelTab();
>>> _tab.setLabel("Blah");
>>> _tab.setId("PanelTab");
>>> _tabbedPane.getChildren().add(_tab);
>>> Application app =
>>>
>> FacesContext.getCurrentInstance().getApplication();
>>
>>> _tree = (HtmlTree)app.createComponent(HtmlTree.COMPONENT_TYPE);
>>> _tree.setClientSideToggle(false);
>>> _tree.setShowRootNode(true);
>>> _tree.setValueBinding("value",
>>>
>> app.createValueBinding("#{myBean.treeModel}"));
>>
>>> _tree.setVar("node");
>>> ValueBinding binding =
>>>
>> app.createValueBinding("#{node.description}");
>>
>>> HtmlOutputText text = new HtmlOutputText();
>>> text.setValueBinding("value", binding);
>>> _tree.getFacets().put("node", text);
>>> _tab.getChildren().add(_tree);
>>> }
>>> return _tabbedPane;
>>> }
>>>
>>> As you can see, it's a stripped down example of what I want to do
>>> in the end, currently I'm just creating one tab, but you get the
>>> picture. There's a corresponding set-method, too.
>>>
>>> My template contains:
>>>
>>> <form jsfc="h:form" id="myMainForm">
>>> <h:panelGrid columns="2">
>>> <t:panelTabbedPane bgcolor="#CCFFFF" serverSideTabSwitch="true"
>>>
>> binding="#{myBean.tabbedPane}">
>>
>>> </t:panelTabbedPane>
>>> <h:panelGrid columns="1" binding="#{myBean.panelGrid}">
>>> </h:panelGrid>
>>> </h:panelGrid>
>>> </form>
>>>
>>> As you can see, I have a panel grid as second element in my outer panel
>>> grid, which is created roughly the same way:
>>>
>>> public HtmlPanelGrid getPanelGrid() {
>>> if (_panelGrid == null) {
>>> Application app = FacesContext.getCurrentInstance().getApplication();
>>> _panelGrid =
>>>
>> (HtmlPanelGrid)app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
>>
>>> _panelGrid.setColumns(1);
>>> _panelGrid.setValueBinding("value",
>>>
>> app.createValueBinding("#{myBean.panelGrid}"));
>>
>>> ....
>>> }
>>> return _panelGrid;
>>> }
>>>
>>> But I don't think it's playing a vital role, I've just listed it here
>>> so that the template makes sense to you. I have some HtmlInput stuff
>>> in it, that's why I need the form.
>>>
>>> CU,
>>> Uli
>>>
>>>
>>>
>>>> Ulrich Teichert a écrit :
>>>>
>>>>
>>>>> Hi,
>>>>>
>>>>> suppose I want to create some UIComponents via Java, which are not
>>>>>
>>>>>
>>>> listed
>>>>
>>>>
>>>>> in any template (for instance, creating a variable number of tabs
>>>>>
>> inside
>>
>>>>> a HtmlPanelTabbedPane).
>>>>> These components will be added to an existing tabbed pane (generated
>>>>> via a template from spring, to be exact).
>>>>>
>>>>> After some self-inflicted pain, I got them to show up just fine and my
>>>>> data inside the tabs (org.apache.myfaces.custom.tree2.HtmlTree) is
>>>>>
>>>>>
>>>> displayed, but after a save/restore cycle through going onto another
>>>>
>> page
>>
>>>>
>>>>
>>>>> and coming back, nothing is there. I can see that I'm getting empty
>>>>>
>> tabs
>>
>>>>> set during the process in my bean, but that's it.
>>>>>
>>>>> Maybe I'm just trying something stupid? Or do I need to implement
>>>>>
>>>>>
>>>> another interface as "Serializable" as well in my bean? I would also
>>>>
>> happy for
>>
>>>>
>>>>
>>>>> any hint where I should start debugging,
>>>>>
>>>>> thanks for any help,
>>>>> Uli
>>>>>
>>>>>
>>>>>
>>>
>>>
>
>