0

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

就像是

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

如果我单击 IBM,我不想单击 Oracle .....[在同一个组件中,我的意思是我不想创建 2 个网格或 2 个列表框,否则]

这可能吗?多谢。

4

2 回答 2

1

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

关于事件侦听器,很容易将侦听器附加到您想要的任何东西上。在 ZK 中,HTMLBasedComponent是常见的根组件之一,并且支持onClickonDoubleClickonRightClick等。

由于这些 ZK 组件是动态创建的,因此您无法将事件侦听器与@Listen注释连接。问题是您事先没有单元格的 id。

相反,您需要在渲染时以编程方式创建。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"/>
于 2013-04-25T15:21:27.233 回答
0

在像Componentszk 这样的表中,总是一行等于
一个对象,一列等于该对象的一个​​属性。
这意味着,Listbox并且Grid不会帮助你。
如果您使用 EE 版本的 zk,我猜您可能喜欢使用Choosenbox。否则我认为没有Component

于 2013-04-25T14:54:18.877 回答