我在JSF2.0和Tomcat 6中使用Primefaces组件。目标是从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
使用2.1.3版本的Mojarra而不是2.0.3版本已经解决了问题。