wicket常用控件使用方法 .
http://blog.csdn.net/jiangfeng861016/article/details/5629410
總述:
Wicket開發和.Net很相似,在html頁面中對控件做wicket的聲明,然后在java代碼中便可以生成一控件。控件的值或內容都以Model存放,所以當修改其值或內容時都是在修改Model中的對象,取值時只需要取到Model中對象再加以變形就是我們想要的值了。Model中可以存放任何類型,因為它存的是object類型。
?
文本控件(Label)
生成:
有兩種方法,第一種不使用Model,直接顯示內容:
html:
<span wicket:id="lbName"></span>
java:
?Label lbName = new Label("lbName","wyk");
this.add(lbName);
此時只能顯示wyk,且不可修改;
第二種方法,使用Model存放內容:
java:
private Model nameModel = new Model();
nameModel.setObject("12345");
Label lb = new Label("lbName",nameModel);
this.add(lb);
這種方法可以讓Label顯示任何我們想要的內容,當然在程序運行當中改變顯示內容時只需要改變Model即可。
設置常值:
如方法一生成,設置一個字符串常量即可。
設置變量值:
如方法二生成,從數據庫或其它數據集中得到變量再將設置Model即可。
取值:
只需要對Model取值即可:
nameModel.getObject().toString()
不使用Model時不能取得文本內容!
--------------------------------------------------------------------------------------------
多行文本控件(MultiLineLabel)
在Label中設置了換行符<br/>,在客戶端仍然原樣輸出,即:123<br/>45m,使用/n則html端不顯示,所以想要輸出多行文本就要使用MultiLineLabel。
java:
nameModel.setObject("123/n45");
this.add(new MultiLineLabel("lbTest",nameModel));
取值和Label相同。
--------------------------------------------------------------------------------------------
表單控件(Form)
表單控件中最重要的莫過于submit的事件處理。
html:
?<form wicket:id="form">
??????????? <span wicket:id="lbName"></span><p/>
??????????? <input type="submit" value="提交"/>
??????? </form>
java:
Form form = new Form("form") {
??????????? @Override
??????????? protected void onSubmit() {
??????????????? String str = txtNameModel.getObject().toString();
??????????????? lbNameModel.setObject(upperAction.execute(str));
??????????? }
??????? };
??????? this.add(form);
??????? form.add(new Label("lbName", lbNameModel));
在Form聲明的時候重寫onSubmit方法。
注:根據html頁面中標志的層次,form 內的控件在java代碼中一定要添加至form中,即form.add。
-------------------------------------------------------------
下拉框(DropDownChoices),單選按鈕組(RadioChoice)
這兩個控件使用方法相同,都只能從一組中選擇一項。
html:
<span wicket:id="raVisible"></span>
java:
//使用List設置控件的text
List lsVisible = Arrays.asList(new String[]{"顯示", "不顯示"});
raVisible = new RadioChoice("raVisible", visibleModel, lsVisible).setSuffix(" ");??????? //設置后綴為空字串可以橫向顯示
form.add(raVisible);
//設置value
raVisible.setModelValue(new String[]{"1", "0"});
//初始值
使用 visibleModel.setObject();可設置初始值。
如:visibleModel.setObject("顯示");
//賦值
前面已經初始化好了控件,所以賦值時只需要將Model的值設置一下即可
//取值
取得Model的值即可,使用:
value = visibleModel.getObject().toString().equals("顯示") ? 1 : 0;
從數據庫中取出一組不確定的值可如下設置:
? private List lsSystemObject = new ArrayList();
??? private Map mapSystemObject = new HashMap();
??? private IChoiceRenderer renderer = new ChoiceRenderer() {
??????? @Override
??????? public Object getDisplayValue(Object object) {
??????????? return mapSystemObject.get(object);
??????? }
??? };
? List listAllSystemObject = getAllSystemObject();
??????? for (int i = 0; i < listAllSystemObject.size(); i++) {
??????????? SystemObject sysObject = (SystemObject) listAllSystemObject.get(i);
??????????? lsSystemObject.add(sysObject.getSystemID().toString());
??????????? mapSystemObject.put(sysObject.getSystemID().toString(), sysObject.getSystemName());
??????? }
??????? ddcSystemObject = new DropDownChoice("ddcSystemObject", systemIDModel, lsSystemObject, renderer);
??????? form.add(ddcSystemObject);
設置初始值:
systemIDModel.setObject("100");
設置選中值:
從數據庫中取得的值,讓其在控件中表現為選中,
systemIDModel.setObject(menu.getSystemID().toString());
注:Model中的值的類型要和List中保持一致。
取值:
依然是從Model中取值,
Integer logTypeID = Integer.valueOf(logTypeIDModel.getObject().toString());
注:DropDownChoice控件則需要在html端聲明為select,不能使用span.
--------------------------------------------------
復選框組(CheckBoxMultipleChoice)
用list來裝所有取出的數據,然后設置一下Model的值即可。下面的例子是一個測試項目,用于設置菜單和動作的關聯:
html:
java:
private CheckBoxMultipleChoice cbcmOperateCode;
private Model operateCodeModel = new Model();
??? private List lsCode = new ArrayList();
??? private Map mapCode = new HashMap();
??? private Integer menuID;
??? IChoiceRenderer renderer = new ChoiceRenderer() {
??????? @Override
??????? public Object getDisplayValue(Object object) {
??????????? return mapCode.get(object);
??????? }
??? };
operateCodeModel.setObject((Serializable) getMenuOpreateCodeByMenuID(getMenuID()));
?cbcmOperateCode = new CheckBoxMultipleChoice("cbcmOperateCode", operateCodeModel, lsCode, renderer);
??????? add(cbcmOperateCode);
//取到數據置入list中
?private List getMenuOpreateCodeByMenuID(int menuID) {
??????? SysRefOperateMenuDAO refDao = new SysRefOperateMenuDAO();
??????? List lsOMenu = new ArrayList();
??????? try {
??????????? List list = refDao.getAllSysRefOperateMenu(menuID);
??????????? for (int i = 0; i < list.size(); i++) {
??????????????? SysRefOperateMenu omenu = (SysRefOperateMenu) list.get(i);
??????????????? lsOMenu.add(omenu.getOperateCode());
??????????? }
??????? } catch (Exception ex) {
??????????? ex.printStackTrace();
??????? }
??????? return lsOMenu;
??? }
設置值 :
將值放入到List中,然后執行序列化操作。
operateCodeModel.setObject((Serializable) getMenuOpreateCodeByMenuID(getMenuID()));
取值:
List lsOperateCode = (List) operateCodeModel.getObject();
??????????????? for (int i = 0; i < lsOperateCode.size(); i++) {
??????????????????? lsOperateCode.get(i).toString();
??????????????? }
--------------------------------------------------
密碼控件(Password)
此控件的生成和取值都比較簡單,只是在賦值的時候《指南》中并沒有提到。
html:
<input type="text" wicket:id="txtPassword">
java:
PasswordTextField pwf = new PasswordTextField("txtPassword", passwordModel);
pwf.setResetPassword(false);
初值:
設置完passwordModel的值后需要對控件進行設置以原密碼而不是空:
pwf.setResetPassword(false);
-----------------------------------------
日期控件(DatePicker)
常用方法是將日期控件添加到一個文本框中,這樣點選日期后文本框中將會顯示日期,并且可以手動在文本框中進行日期的修改。
html:
<input type="text" wicket:id="txtRegisterDate" />
java:
DateTextField date = new DateTextField("txtRegisterDate", registerDateModel, "yyyy-MM-dd");
??????? date.setRequired(true);
??????? DatePicker dp = new DatePicker();
??????? date.add(dp);
??????? form.add(date);
"yyyy-MM-dd"用于格式化日期,但此控件只能取到日期而不能取到時間。
取值 :
取值時要注意,Model中的值要進行轉換.
DateFormat tmpYearFormat = new SimpleDateFormat("yyyy-MM-dd");
String strRegisterDate = tmpYearFormat.format(registerDateModel.getObject()) + strRegDate;
Date registerDate = dateFormat.parse(strRegisterDate);
-----------------------------------------------------------------
樹控件(TreeTable):
這個控件比較復雜,將樹和表格集成到了一起。需要注意幾點:1、列的顯示? ;2、父子結點的生成;3、結點點擊事件的處理。
1.使用IColumn定義要顯示的列:
?private IColumn columns[] = new IColumn[]{new PropertyTreeColumn(new ColumnLocation(Alignment.LEFT, 180, Unit.PX), "菜單名稱", "userObject.name"),
??????? new PropertyRenderableColumn(new ColumnLocation(Alignment.MIDDLE, 1, Unit.PROPORTIONAL), "菜單ID", "userObject.menuID"),
??????? new PropertyRenderableColumn(new ColumnLocation(Alignment.MIDDLE, 5, Unit.PROPORTIONAL), "編碼", "userObject.code"),
??????? new PropertyRenderableColumn(new ColumnLocation(Alignment.RIGHT, 350, Unit.PX), "鏈接地址", "userObject.linkAddress"),};
2.樹控件所使用的Model是它自己的TreeModel
我的方法從數據集中做遞歸取出父子關系的同時向TreeModel中添加結點:
private TreeModel treeModel;
實現:
treeModel = buildTreeModel(rootMenuID, "");
?/**
???? * 得到TreeTable可使用的樹結構
???? */
??? private TreeModel buildTreeModel(int parentID, String type) {
??????? recursionSysMenu(rootNode, parentID, type);
??????? return new DefaultTreeModel(rootNode);
??? }
??? /**
???? * 取得層次關系
???? */
??? private void recursionSysMenu(DefaultMutableTreeNode rtNode, int parentID, String type) {
??????? List sysMenuList = new ArrayList();
??????? sysMenuList = getSubSysMenuByParent(parentID, type);
??????? for (int i = 0; i < sysMenuList.size(); i++) {
??????????? SysMenu sysmenu = new SysMenu((SysMenu) sysMenuList.get(i));
??????????? DefaultMutableTreeNode parentNode = new DefaultMutableTreeNode(sysmenu);
??????????? rtNode.add(parentNode);
??????????? //遞歸生成子菜單
??????????? recursionSysMenu(parentNode, ((SysMenu) sysMenuList.get(i)).getMenuID(), type);
??????? }
??? }
這樣就可以生成一棵樹了,如下:
html:
<div wicket:id="treeTable"></div>
java:
TreePage treePage = new TreePage("view");
tree = new TreeTable("treeTable", treePage.getTreeModel(), columns);
this.add(tree);
3.結點點擊處理:
在定義的時候需要重寫onNodeLinkClicked方法:
?TreePage treePage = new TreePage("view");
??????? tree = new TreeTable("treeTable", treePage.getTreeModel(), columns) {
??????????? @Override
??????????? protected void onNodeLinkClicked(AjaxRequestTarget target, TreeNode node) {
??????????????? SysMenu menu = (SysMenu) ((DefaultMutableTreeNode) node).getUserObject();
??????????????? SysMenuEditContainer page = new SysMenuEditContainer(menu.getMenuID().toString());
??????????????? setResponsePage(page);
??????????????? getTreeState().selectNode(node, true);
??????????????? super.onNodeLinkClicked(target, node);
??????????? }
??????? };
??????? tree.setRootLess(true);
??????? tree.getTreeState().expandAll();
??????? tree.setLinkType(LinkType.REGULAR);
??????? add(tree);
tree.getTreeState().expandAll();//是將樹的結點全部展開
setLinkType:點擊時鏈接的方式,上面的方面是會刷新的,如果想不刷新可以使用AJAX,但具體沒研究過。
?
總結
以上是生活随笔為你收集整理的wicket常用控件使用方法 .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLite使用手记
- 下一篇: Confluence与Jira整合之统一