我创建了一个dataTable组件,我想在标题中添加一个隐藏列按钮,但该按钮不会触发该事件。
这是标头的编码方法。我在函数呈现标题中,当标题必须写入隐藏自己的按钮时调用此标题。
private void encodeHideColumnOption(FacesContext context,
UIComponent table, ResponseWriter writer) throws IOException {
HtmlCommandButton hide = (HtmlCommandButton) context
.getApplication()
.createComponent(HtmlCommandButton.COMPONENT_TYPE);
hide.setId("hb_" + model.getColumnIndex());
hide.setValue("X");
AjaxBehavior ajax = new AjaxBehavior();
ajax.setRender(Arrays.asList(":" + table.getParent().getClientId(context),
":messagePanel"));
ajax.setExecute(Arrays.asList(":form"));
hide.addClientBehavior(hide.getDefaultEventName(), ajax);
hide.addActionListener(new ActionListenerHideOption());
table.getChildren().add(hide);
hide.encodeAll(context);
}
这是ActionListener类
@SessionScoped
public class ActionListenerHideOption implements ActionListener, Serializable {
public ActionListenerHideOption(){
}
@Override
public void processAction(ActionEvent event)
throws AbortProcessingException {
System.out.println("Action Listener Fired :D");
}
}
但是当我点击按钮时没有发生任何事情,我用这个问题验证:h:commandLink / h:commandButton is not being invoked但是不起作用。你能救我吗?
----编辑----
我正在尝试不同的方法,但我真的不明白为什么我用这种方式工作
<h:commandButton id="hb_x" value="∅">
<f:actionListener type="package.ActionListenerHideOption" />
<f:ajax render=":form:dataTable" onevent="tableReset" />
</h:commandButton>
但另一种方式却没有... anyOne可以帮助我吗?
答案 0 :(得分:0)
这是解决方案。在渲染dataTable组件(我的dataTable组件)时,我必须添加此函数来解码组件(dataTable)
@Override
public void decode(FacesContext context, UIComponent component) {
for (UIComponent child : component.getChildren()) {
for (UIComponent grandChild : child.getChildren()) {
if (grandChild instanceof HtmlCommandButton) {
grandChild.decode(context);
}
}
}
}
这允许在我的dataTable中的所有HtmlCommandButton
中触发解码过程...我认为它将与HtmlCommandLink
一起使用,但未经过测试。可能是更好的代码,如果anyOne可以在性能和其他方面做更好的代码,欢迎:)
----编辑----
我做了一个更好的解决方案,它解码了我的dataTable上的所有内容。
@Override
public void decode(FacesContext context, UIComponent component) {
decodeChildren(context, component);
}
public void decodeChildren(FacesContext context, UIComponent component) {
for (UIComponent child : component.getChildren()) {
if (!child.getChildren().isEmpty()) {
decodeChildren(context, child);
}else{
child.decode(context);
}
}
}
就是这样。 =)