晚上好,我告诉你我的问题:
在ZK框架中,我需要在同样被渲染的列表框中使用动态渲染的组合框的onSelect方法。
当我选择其中一个组合框选项时,它的内容应该保存在DocumentoVinculado类的observaciones变量中。但是onSelect不起作用!我感谢你的帮助。附代码:
.zul
<zk>
<window id="myWindow" apply="com.curso.controller.NewFileComposer" title="Help">
<listbox id="myListbox">
<listhead>
<listheader label="NroGEBI"></listheader>
<listheader label="Observaciones"></listheader>
</listhead>
</listbox>
<label id="myLabel"></label>
</window>
</zk>
作曲家/控制器
public class NewFileComposer extends BaseController {
private Window myWindow;
private Listbox myListbox;
private Combobox myCombobox0;
private Combobox myCombobox1;
private Label myLabel;
public void onSelect$myCombobox0() { myLabel.setValue(myCombobox0.getValue()); }
public void onSelect$myCombobox1() { myLabel.setValue(myCombobox1.getValue()); }
public void onCreate$myWindow() {
ListModelList<DocumentoVinculado> modelo = new ListModelList<>(crearLista());
myListbox.setModel(modelo);
myListbox.setItemRenderer(new NewFileRender());
}
private List<DocumentoVinculado> crearLista() {
List<DocumentoVinculado> docVinculados = new ArrayList<>();
docVinculados.add(new DocumentoVinculado("123GEBI1", " "));
docVinculados.add(new DocumentoVinculado("123GEBI2", " "));
return docVinculados;
}
}
渲染
public class NewFileRender implements ListitemRenderer {
@Override
public void render(Listitem item, Object data, int i) throws Exception {
DocumentoVinculado docVinculado = (DocumentoVinculado) data;
Listcell nroGebiCell = new Listcell(docVinculado.getNroGEBI());
nroGebiCell.setParent(item);
Listcell opcionesCell = new Listcell();
opcionesCell.appendChild(comboboxObservaciones(i));
item.appendChild(opcionesCell);
}
private Combobox comboboxObservaciones(int i) {
Combobox combobox = new Combobox();
List<String> listaDeOpciones = listaDeOpciones();
for(String opcion : listaDeOpciones) {
Comboitem myComboitem = new Comboitem();
myComboitem.setLabel(opcion);
myComboitem.setParent(combobox);
}
combobox.setId("myCombobox" + i);
return combobox;
}
private List<String> listaDeOpciones() {
List<String> opciones = new ArrayList<>();
opciones.add(" ");
opciones.add("Opcion1");
opciones.add("Opcion2");
return opciones;
}
}
感谢您的阅读。干杯
从您的语法来看,您似乎正在使用GenericForwardComposer
作为BaseController的超级类。这是正确的吗?
根据您已经做了多少,我建议您检查是否可以改用SelectorComposer
。它们以相同的方式工作(连接组件和侦听事件(,但SelectorComposer
在连接方式上要明确得多。GenericForwardComposer
可能有点容易出错,除非您非常清楚它的生命周期。
关于onSelect在这种情况下不会发射的原因:
ZK作曲家分阶段工作。一个重要的阶段是";撰写";阶段,在此期间创建组件,将事件侦听器放置到位,等等。
在该阶段结束时;afterCompose;阶段发生。在afterCompose期间;魔术;事情(比如当前composer中私有组件的连接,或者同一类中onSelect$myCombobox0的自动转发(会发生。它还将尝试重新连接在其根锚组件上触发onCreate之前再次丢失的内容。
现在,如果您的组合框是在该步骤之后动态创建的(例如,在完成以上所有操作后发生的"onCreate$myWindow"事件期间(,则编写器将已经完成了所有的连接和转发,并且不知道要重新检查组件是否有其他连接。
所有这些都解释清楚了,你能做些什么呢?
首先,您可以考虑将onCreate代码移到doAfterCompose方法中。如果您在doAfterCompose(从genericFowardComposer重写(期间执行此操作,则不必等待onCreate生成Listbox内容,您应该足够早,以便在这些组件上触发自动连接。
应该是这样的:
@Override
public void doAfterCompose(Component comp) {
ListModelList<DocumentoVinculado> modelo = new ListModelList<>(crearLista());
myListbox.setModel(modelo);
myListbox.setItemRenderer(new NewFileRender());
}
第二,如果你从generalForwardComposer转到SelectorComposer,你实际上可以告诉作曲家重新布线;"按需";通过使用Selectors.wireComponents方法。当然,只有当您的应用程序可以针对此更改进行重构时,这才有效。