目前尚不清楚您在獨立性這裏需要什麼。你是在尋找與你的數據模型有關的分離,還是你只想爲每個渲染單元使用不同的事件偵聽器?
關於事件監聽器,將聽衆附加到任何你喜歡的事情上是非常容易的。在ZK中,HTMLBasedComponent是通用根組件之一,支持onClick
,onDoubleClick
,onRightClick
等。
由於這些ZK組件是動態創建的,因此您不能使用@Listen
批註wire event listeners。問題是你沒有預先爲單元格設置ID。
相反,您需要在渲染時使用programmatically create the EventListener
。
// in your RowRenderer
public void render(Row row, Data data, int index) {
Label column1 = new Label(data.getOne());
Label column2 = new Label(data.getTwo());
column1.setParent(row);
column2.setParent(row);
column1.addEventListener(Events.ON_CLICK, new EventListener<Event>() {
public void onEvent(Event event) {
// handle event
}
});
column2.addEventListener(Events.ON_CLICK, new EventListener<Event>() {
public void onEvent(Event event) {
// handle event
}
});
}
注意,如在這裏實現,您可以爲渲染每一個細胞新EventListener
。這不是很有效,所以如果你可以使你的狀態變爲EventListener
,並將必要的數據附加到Label
本身,你可以節省很多計算。
關於代碼分離,如果您的數據模型是面向列而不是按行的,那麼您將找不到滿足此要求的標準ZK組件。也就是說,像Grid
和Listbox
這樣的組件被渲染爲從頂部開始的行,使用RowRenderers
等。如果這是你的問題,你會想要推出自己的組件。這聽起來比聽起來容易很多。
public class ColumnGrid extends Hlayout {
private ColumnListModel model;
private ColumnRenderer<? extends Component> renderer;
public void setModel(ColumnListModel model) {
this.model = model;
}
public void setRenderer(ColumnRenderer renderer) {
this.renderer = renderer;
}
public void onCreate() {
for (int i=0; i<model.size(); i++) {
Column col = new Column();
appendChild(col);
renderer.render(col, model.getElementAt(i), i);
}
}
}
public class Column extends Vlayout {}
public interface ColumnRenderer<T extends Component> {
render(Column column, T data, int index);
}
這只是一個骨架,但你明白了。
然後,您可以甚至在你zul
文件中使用這樣的:
<?component name="colGrid" class="com.sean.is.cool.ColumnGrid" ?>
<colGrid model="myModel" renderer="myColRenderer"/>