2011-09-30 69 views
0

我將Primefaces組件與JSF2.0和Tomcat 6一起使用。目標是從bean動態創建服務器組件。只是爲了測試我做的下一件事:爲什麼commandButton動作監聽器不工作?

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 
+0

你什麼時候調用'createComponents()'?與具體問題無關,我建議你重新考慮這種方法。 ''或可能''或''要容易得多。 http://stackoverflow.com/questions/3409053/jsf2-can-i-add-jsf-components-dynamically – BalusC

+0

我調用這個方法時,bean構造函數正在調用。使用數據表對我不好,因爲我想動態地將不同的組件添加到頁面到我想要的地方。 – Barbarian

+0

好的回到這個問題,有沒有''父母? – BalusC

回答

1

使用2.1.3版鑽嘴魚科,而不是2.0.3已經解決了問題。