我正在動態創建一個MenuItem,並且我想在單擊MenuItem時添加一個自定義監聽器。JSF添加動作監聽器
我試着添加addActionListener和setActionListener,但當鏈接被點擊時,這些都不會被調用。
它似乎有一個名爲「偵聽器」附加到MenuItem(我可以看到這個時,靜態調試一個監聽器MenuItem設置)。任何想法如何正確添加偵聽器?
我正在動態創建一個MenuItem,並且我想在單擊MenuItem時添加一個自定義監聽器。JSF添加動作監聽器
我試着添加addActionListener和setActionListener,但當鏈接被點擊時,這些都不會被調用。
它似乎有一個名爲「偵聽器」附加到MenuItem(我可以看到這個時,靜態調試一個監聽器MenuItem設置)。任何想法如何正確添加偵聽器?
他們需要被創建並添加如下(從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");
的主要問題,通過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;
}
然後你apprarently仍然使用舊JSF 1.0/1.1(已超過換成1.2 4(!!)年前),點擊上述鏈接看看JSF 1.1創建一個ActionListener的方法,你仍然需要自己設置一個固定的ID – BalusC
事實證明在Maven中有一個引用到另一個使用MyFaces的項目,即使我有JSF 1.2它沒有編譯: - )...再次感謝您的回覆。 –
每個組件的唯一ID。如有必要,您可以添加一些計數器,例如'child.setId(「someFixedId」+ parent.getChildCount()); parent.getChildren()。add(child);' – BalusC