我有一个扩展窗口和implments IdSpace,AfterCompose的控制器。 但是,当控制器初始化时,函数afterCompose永远不会执行。无法弄清楚我错过了什么。我的这部分代码:
DataTemplateWindowController.java
public class DataTemplateWindowController extends Window implements IdSpace, AfterCompose {
...
public DataTemplateWindowController() {
Executions.createComponents("dataTemplate.zul", this, null);
Selectors.wireComponents(this, this, false);
Selectors.wireEventListeners(this, this);
}
@Override
public void afterCompose() {
Do something smart!!
}
}
初始化。 的 HomeWindowController.java
public class HomeWindowController extends SelectorComposer<Component> {
...
@Wire
Window homeWindow;
DataTemplateWindowController fa2;
public void setDataTemplate() {
fa2 = new FA2WindowController();
fa2.setParent(homeWindow);
}
}
页面加载正常,但是afterCompose函数永远不会执行。
我知道我可以避免实现AfterCompose然后在初始化后运行函数fa2.afterCompose()但我希望AfterCompose能够为我完成这项工作。
答案 0 :(得分:1)
正如你在AfterCompose(of org.zkoss.zk.ui.ext.AfterCompose)接口的javadoc中看到的那样:
如果要知道何时创建ZK加载程序,则由组件实现 它。如果实现此接口,则调用{@link #afterCompose}, 在ZK loader创建这个组件之后,它的所有子组件和 分配ZUML页面中定义的所有属性。这就是所谓的 &#34;构成&#34;
所以方法:&#34; afterCompose&#34;永远不会被你自己的java代码自动调用(在你的例子中你的方法setDataTemplate()中的代码)。只有在ZUL页面中使用组件时才会调用它。
你也可以在org.zkoss.zk.ui.ext.AfterCompose的Javadoc中看到:
如果是手动创建的,则调用{@ link#afterCompose}是调用者的工作。
如果您不需要在撰写过程后在您中设置任何属性或子项,请不要使用此界面并将您的代码放入构造函数中,否则,您必须手动调用它需要它(通常在你的SelectorComposer的doAfterCompose中):
public class HomeWindowController extends SelectorComposer<Component> {
...
@Wire
Window homeWindow;
DataTemplateWindowController fa2;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
setDataTemplate();
}
public void setDataTemplate() {
fa2 = new FA2WindowController();
fa2.setParent(homeWindow);
fa2.afterCompose();
}
}