zk component develop
一、)java 类及方法 1)先开发一个服务器端的组件,通常是继承 abstractComponent ,如果是html 类型的组件,继承HtmlBaseComponent 就可以了。
2)如果需要一个widget需要通知服务器端组件,需要在服务器端的component上注册Client Event http://docs.zkoss.org/wiki/Synchronize_States addClientEvent(Button.class, Events.ON_FOCUS, 0); 3)在服务器端component 上调用客户端widget事件, 用response(event,message) http://docs.zkoss.org/wiki/Invoke_Client_Special_Functions
二、)js文件 js 中的 $init 是widget的初始化方法 $define 就是定义widget 的get|set 方法 三、 获取单击单元格对应的列
<zk><zscript></zscript><listbox id="listbox" width="200px"><listhead><listheader label="col1"></listheader><listheader label="col2"></listheader></listhead><listitem><listcell label="a1" onclick="showColumn(self)"></listcell><listcell label="a2" onclick="showColumn(self)"></listcell></listitem><listitem><listcell label="b1" onclick="showColumn(self)"></listcell><listcell label="b2" onclick="showColumn(self)"></listcell></listitem></listbox></zk> listbox grid tree 介绍 http://docs.zkoss.org/wiki/Grids,_Trees_and_Listbox 组件开发向导 http://docs.zkoss.org/wiki/ZK_5.0_Component_Imagepicker
1 、对于给组件设置menupopup 不起作用的情况 Menupopup menupopup = new Menupopup() menupopup.appenChildren(new Menuitem("a") Grid grid = new Grid() grid.setContext(menupop) 注意:需要 menupop.setParent(grid) // 这个方法需要注意,不是所有的Component都支持Menupopup 也就是说 上下文菜单也需要在 html 中存在,然后,才显示 因为所有的内容都是以html为准备,所以任何组件都必须在html的上下文中存在。
2 、设置组件为灰色 yourTextbox.setReadonly(false); yourListbox.setDisabled(false); yourCheckbox.setDisabled(false);
3 、对于 Listbox & Grid 的增加和删除,可以通过对他们的Model进行 Add |Remove Listbox.getModel().add(new Object) Listbox.getModel().remove(Object)
4 、对于Domain,必须有一个为一个Id 主键,来确保CRUD的一致性 (也可以不要,不过,需要在 listbox 加一个隐藏列来处理)
5 、组件的方法复用 A 组件的onClick 方法是用 B 的onClick方法 --便于使用按钮和右键菜单一致的情况 ComponentsCtrl.applyForward(A, "onClick=B.onClick") ComponentsCtrl.applyForward(e.target, "onClick=tbb_pre${zymenu.bh}.onClick")
6、验证组件数值的合法性 Textbox.getValue()就自动触发校验
7、jar 打包 ,对于不能够执行 generate-domain-from-database ,需要先将对应的类打包起来 jar cvf codeg.jar -C "F:\zkoss\Panform\out\production\Panform" .
12、如果对表头排序,不使用默认的排序方式,而使用数据排序
def onSortHeaders(){ Msztsbqk msztsbqk = new Msztsbqk() listheadmsztsbqk.getChildren().each { listheader -> listheader.onSort = {Event e -> Listheader l = (Listheader) listheader if (msztsbqk.properties.containsKey(l.getId())) { if (l.getSortDirection() == "ascending") { l.setSortDirection("descending") sortTj = l.getId() + " desc" }else{ l.setSortDirection("ascending") sortTj = l.getId() + " asc" } refresh(pagingmsztsbqk.getActivePage(),sortTj) e.stopPropagation() // 不执行默认的排序方式 } // def sortTj = ?"ascending":"descending" } } }
13、listbox 或者grid 如果使用了ModelList 方式来展示数据,如果要排序,需要 对listbox 排序 如果是使用model ,需要实现ListModelExt 来覆写sort 或者extend ListModelList ,使用
Components.sort(listbox.getItems(),cmpr); public class PanModeList extends ListModelList { private transient Listbox listbox; public PanModeList(Listbox listbox, List list, boolean live) { super(list, live); this.listbox = listbox; } @Override public void sort(Comparator cmpr, boolean ascending) { Components.sort(listbox.getItems(),cmpr); // super.sort(cmpr, ascending); //To change body of overridden methods use File | Settings | File Templates. } }
然后、listbox.setModel(new PanModeList(listbox,Msqrqk.list(),false))
初始化一个组件 使用onCreate http://docs.zkoss.org/wiki/ZK/How-Tos/Concepts-and-Tricks#Dynamic_cursor.2Ffield-sensitiv_help_and_tooltip