2013-04-25 54 views
0

我是新來的ZK框架[新手]版本5.0.8 MVC方法我試圖實現一個組件,它們的列彼此獨立....所有我想要做的是能代表2列中的數據,並能如果我點擊IBM不是我想要點擊的Oracle ..... [在同一對點擊響應每列ZK具有獨立列的組件

喜歡的東西

----------------------------------- 
    Company----Company 
    Oracle IBM 
    Microsoft Xerox 
    HP  Apple 
----------------------------------- 

組件我的意思是我不想創建2格或2列表框或其他]

是這個p ossible?非常感謝。

回答

1

目前尚不清楚您在獨立性這裏需要什麼。你是在尋找與你的數據模型有關的分離,還是你只想爲每個渲染單元使用不同的事件偵聽器?

關於事件監聽器,將聽衆附加到任何你喜歡的事情上是非常容易的。在ZK中,HTMLBasedComponent是通用根組件之一,支持onClickonDoubleClickonRightClick等。

由於這些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組件。也就是說,像GridListbox這樣的組件被渲染爲從頂部開始的行,使用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"/> 
0

在zk的Components這樣的表中,總是一行等於
到一個對象和一個柱到這個對象的一個​​屬性。
這意味着,ListboxGrid不會幫助你。
如果您使用zk的EE版本,我想您可能會喜歡使用Choosenbox。 否則我不認爲這是Component