0

我将 Primefaces 组件与 JSF2.0 和 Tomcat 6 一起使用。目标是从 bean 动态创建服务器组件。只是为了测试,我做了接下来的事情:

    private Panel editorPanel;    
    private CommandButton btn;

    public void createComponents()
    {
        this.setEditorPanel(new Panel());
        this.getEditorPanel().setRendered(true);

        btn = new CommandButton();
        btn.setId("btn1");
        btn.setRendered(true);
        btn.setAjax(true);
        btn.setValue("Click!");        

        btn.addActionListener(new ActionListener()
        {
            @Override
            public void processAction(ActionEvent arg0) throws AbortProcessingException
            {
                addNewButton();                
            }
        });

        this.getEditorPanel().getChildren().add(btn);
    }


    public void addNewButton()
    {
        CommandButton btn2 = new CommandButton();
        btn2.setRendered(true);        

        this.getEditorPanel().getChildren().add(btn2);
    }

标记:

    <p:panel binding="#{mybean.editorPanel}">

    </p:panel>

在第一页呈现加载按钮。按下按钮后,由于请求,我的 bean 正在重新创建,但从未触发“addNewButton”方法处的断点。在该请求之后,该按钮消失了。Bean 被标记为@RequestScoped 和@ManagedBean(name="mybean")。标记中未动态呈现的其他组件可以成功使用 bean 方法。这个按钮我做错了什么?

谢谢

编辑:我知道我可以使用相同的方法将按钮添加为前一个按钮,但目标是动态添加一些组件。

编辑 2:我将 ActionListener 的单独实现作为公共内部类,我得到下一个:

           Caused by: java.lang.InstantiationException:web.beans.pages.TemplateEditBean$BtnListener
           at java.lang.Class.newInstance0(Unknown Source)
           at java.lang.Class.newInstance(Unknown Source)
           at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:103)
... 90 more
4

1 回答 1

1

使用 2.1.3 版本的 Mojarra 代替 2.0.3 已解决问题。

于 2011-10-01T14:33:25.647 回答