2010-02-16 165 views
1

我正在動態創建一個MenuItem,並且我想在單擊MenuItem時添加一個自定義監聽器。JSF添加動作監聽器

我試着添加addActionListener和setActionListener,但當鏈接被點擊時,這些都不會被調用。

它似乎有一個名爲「偵聽器」附加到MenuItem(我可以看到這個時,靜態調試一個監聽器MenuItem設置)。任何想法如何正確添加偵聽器?

回答

3

他們需要被創建並添加如下(從one of my previous answers複製):

FacesContext context = FacesContext.getCurrentInstance(); 
MethodExpression actionListener = context.getApplication().getExpressionFactory() 
    .createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class}); 
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener)); 

...其中#{bean.actionListener}確實存在,並宣佈與託管bean名稱bean相關的支撐類似如下:

public void actionListener(ActionEvent event) { 
    // ... 
} 

更多importantingly,你需要給任何動態創建UICommand(和UIInput )組件也是一個固定的ID,否則它會得到一個自動生成的ID,這可能導致JSF無法在應用請求值階段定位/關聯它。

因此,也這樣做:

uiCommandComponent.setId("someFixedId"); 
+0

然後你apprarently仍然使用舊JSF 1.0/1.1(已超過換成1.2 4(!!)年前),點擊上述鏈接看看JSF 1.1創建一個ActionListener的方法,你仍然需要自己設置一個固定的ID – BalusC

+0

事實證明在Maven中有一個引用到另一個使用MyFaces的項目,即使我有JSF 1.2它沒有編譯: - )...再次感謝您的回覆。 –

+0

每個組件的唯一ID。如有必要,您可以添加一些計數器,例如'child.setId(「someFixedId」+ parent.getChildCount()); parent.getChildren()。add(child);' – BalusC

0

的主要問題,通過BalusC指出的是,你需要設置ID。 然後,您可以添加事件偵聽器,如下所示: private MenuItem createItem(String name){ MenuItem item = new MenuItem(); item.addActionListener(新的ActionListener(){

 public void processAction(ActionEvent event) 
       throws AbortProcessingException { 
      // handle event 

     } 
    }); 
    item.setValue(name); 
    return item; 
}