具有独立列的ZK组件

时间:2013-04-25 12:45:35

标签: components zk

我是ZK框架的新手[newbie]版本5.0.8 MVC方法我试图实现一个组件,它们的列彼此独立....我想要做的就是能够代表数据2列,能够响应每列的点击

这样的东西
-----------------------------------
  Company----Company
   Oracle    IBM
   Microsoft Xerox
   HP        Apple
 -----------------------------------

如果我点击IBM我想不要点击Oracle ..... [在同一个组件中我的意思是我不想创建2个网格或2个列表框或者其他]

这可能吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

目前尚不清楚您在独立性方面究竟需要什么。您是在寻找数据模型的分离,还是只想为每个渲染的单元格寻找不同的事件监听器?

关于事件监听器,将监听器附加到您想要的任何内容都非常容易。在ZK中,HTMLBasedComponent是常见的根组件之一,支持onClickonDoubleClickonRightClick等。

由于这些ZK组件是动态创建的,因此您不能wire event listeners使用@Listen注释。问题是您事先没有单元格的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"/>

答案 1 :(得分:0)

在像zk的Components这样的表格中,总共等于一行 到一个对象和一个列到该对象的属性。
这意味着,ListboxGrid对您无济于事 如果你使用zk的EE版本,我想你可能想使用Choosenbox。 否则,我认为没有Component