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 の個別の実装を public 内部クラスとして作成し、次を取得します。
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