分享

[Apache Click快速开发]Panel和Tree

 用勿龍潛 2012-01-05

[Apache Click快速开发]Panel和Tree

分类: Java 132人阅读 评论(4) 收藏 举报

Click中的Panel表示网页上一个区域,或者说是一种数据的展现格式,我们使用模板可以定义数据的具体展现格式,比如显示一个表格,或者显示成一个个的图文框等。

Click的API中还有ListPanel和TabbedPanel两种变相的Panel,实际上只是多个Panel的集合而已。

创建一个Panel

  1. Panel header = new Panel("header","templates/header.htm")  
创建一个ListPanel,来装载多个Panel

  1. private ListPanel listPnl = new ListPanel("listPanel");  

把多个Panel添加到ListPanel,并添加数据

  1. addControl(listPnl);  
  2. listPnl.add(new Panel("header","templates/header.htm"));  
  3. listPnl.add(new Panel("panel1","templates/panel_item1.htm"));  
  4. listPnl.add(new Panel("panel2","templates/panel_item2.htm"));  
  5. addModel("emps", es.getEmpList()); // List<Person>   
header.htm只是用来显示一个标题的模板

  1. <html>  
  2. <head>  
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  4. <title>This is Header</title>  
  5. <style type="text/css">  
  6.     body{  
  7.         margin:0;padding:0  
  8.     }  
  9.     .banner{  
  10.         margin:2px;border-radius:10px;  
  11.         box-shadow:0px 3px 30px rgba(0000.1) inset;  
  12.         padding:10px;  
  13.     }  
  14. </style>  
  15. </head>  
  16. <body>  
  17. <div class="banner"><h1 style="text-shadow:5px 2px 6px #000;">Apache Click - Panel & Tree</h1></div>  
  18. </body>  
  19. </html>  
panel_item1.htm和panel_item2.htm只是数据2种不同展示模板

  1. <html>  
  2. <head>  
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  4. <style type="text/css">  
  5.     div.box{min-width:400px;width:50%;}  
  6.     table{   width:100%;margin-left:2px;  
  7.         border-layout:fixed;  
  8.         border-collapse:collapse;  
  9.         font-size:11pt;}  
  10.     th{background:grey;  
  11.         border:1px solid black;}  
  12.     td{text-align:center;}  
  13. </style>  
  14. </head>  
  15. <body>  
  16. <div class="box">  
  17.     <table border="1">  
  18.     <thead>  
  19.     <tr><th>姓名</th><th>性别</th><th>职位</th><th>薪酬</th></tr>  
  20.     </thead>  
  21.     <tbody>  
  22.     #foreach($e in $emps)  
  23.     <tr>  
  24.     <td>$e.name</td><td>$e.gender</td>  
  25.     <td>$e.job</td><td>$e.salary</td>  
  26.     </tr>  
  27.     </tbody>  
  28.     #end  
  29.     </table>  
  30. </div>  
  31. </body>  
  32. </html>  
  1. <html>  
  2. <head>  
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  4. </head>  
  5. <body>  
  6. #foreach($e in $emps)  
  7. <div style="width:200px;padding:10px;float:left;margin:3px;border:1px solid grey;font-size;10pt">  
  8.     <p>姓名:$e.name</p>  
  9.     <p>性别:$e.gender</p>  
  10.     <p>职位:$e.job</p>  
  11.     <p>薪酬:$e.salary</p>  
  12. </div>  
  13. #end  
  14. </body>  
  15. </html>  
我想到的ListPanel所带来的好处就是将一个也没模块化,从而提高各模块的重用。当然,这其中也包含了设计的灵活性。

最终,我顺利的得到了效果。


接着,我又做了一个Tree的小例子。如果大家不觉得烦,那就继续看吧。。

Tree是一个相对复杂的组件,如果不是得益于Apache,我们可能要做得更多。

创建一个Tree(为了尽量和Panel的界面风格相似,我重用了header.htm来渲染我的标题,我所要做的就是在网页上边添加一个panel而已)

  1. private Tree tree;  
  1. public TreeDemo(){  
  2.     tree = createCategoryTree();  
  3.     addControl(new Panel("header""templates/header.htm"));  
  4.     addControl(tree);  
  5. }  
下面我创建了一个购物网站的关于手机的分类

  1. private Tree createCategoryTree(){  
  2.     tree = new Tree("category_tree");  
  3.     TreeNode rootNode = (TreeNode)getContext().getSession().getAttribute("treeNodes");  
  4.     if(rootNode != null){  
  5.         tree.setRootNode(rootNode);  
  6.         tree.expand(rootNode);  
  7.         return tree;  
  8.     }  
  9.     rootNode = new TreeNode("root");  
  10.     TreeNode phone = new TreeNode("手机""1");  
  11.     rootNode.add(phone);  
  12.           
  13.     phone.add(new TreeNode("HTC""101"false));  
  14.     phone.add(new TreeNode("三星""102"));  
  15.     phone.add(new TreeNode("摩托罗拉""103"));  
  16.     phone.add(new TreeNode("诺基亚""104"));  
  17.     phone.add(new TreeNode("索尼爱立信""105"));  
  18.     phone.add(new TreeNode("LG""106"));  
  19.     phone.add(new TreeNode("飞利浦""107"));  
  20.           
  21.     TreeNode phone_accessories = new TreeNode("手机配件","2");  
  22.     rootNode.add(phone_accessories);  
  23.           
  24.     phone_accessories.add(new TreeNode("电池""201"));  
  25.     phone_accessories.add(new TreeNode("充电器""202"));  
  26.     phone_accessories.add(new TreeNode("贴膜""203"));  
  27.     phone_accessories.add(new TreeNode("保护套""204"));  
  28.     phone_accessories.add(new TreeNode("耳机""205"));  
  29.     phone_accessories.add(new TreeNode("存储卡""206"));  
  30.       
  31.     tree.setRootNode(rootNode);  
  32.     tree.expand(rootNode);  
  33.           
  34.     if(tree.getRootNode()!=null){  
  35.         getContext().getSession().setAttribute("treeNodes",rootNode);  
  36.     }  
  37.     return tree;  
  38. }  
然后我在htm中写入刚刚创建的Tree的名字$category_tree,它就显示出来了,虽然外貌不佳,但是我看到API中有可以设置图标的地方。

之后,我发现,Click的Tree组件的节点时可以多选的,并且可以通过API来获取所中的所有节点和展开的节点。首先这需要处理页面的请求,官方是通过重写Page中的onGet方法来完成的。下面的代码,我稍微扩展了一些。我将每次点击的节点名字放入到一个ArrayList ,并判断是选中还是非选中,分别进行添加和移除操作,最后把这个ArrayList放入到session中,以保持状态到下次点击时。

  1. @Override  
  2. public void onGet() {  
  3.     String selectedId = getContext().getRequestParameter(Tree.SELECT_TREE_NODE_PARAM);  
  4.     String expandedId = getContext().getRequestParameter(Tree.EXPAND_TREE_NODE_PARAM);  
  5.     ArrayList<Object> selected = (ArrayList<Object>)getContext().getSession().getAttribute("selected");  
  6.     ArrayList<Object> expanded = (ArrayList<Object>)getContext().getSession().getAttribute("expanded");  
  7.     if(selected == null){  
  8.         selected = new ArrayList<Object>(0);  
  9.     }  
  10.     if(expanded == null){  
  11.         expanded = new ArrayList<Object>(0);  
  12.     }  
  13.     if(selectedId!=null){  
  14.         TreeNode selectedNode = tree.find(selectedId);  
  15.         Object val = selectedNode.getValue();  
  16.         if(selectedNode.isSelected()){  
  17.             selected.add(val);  
  18.         }else{  
  19.             selected.remove(val);  
  20.         }  
  21.         getContext().getSession().setAttribute("selected", selected);  
  22.     }  
  23.     if(expandedId!=null){  
  24.         TreeNode expandedNode = tree.find(expandedId);  
  25.         Object val = expandedNode.getValue();  
  26.         if(expandedNode.isExpanded()){  
  27.             expanded.add(val);  
  28.         }else{  
  29.             expanded.remove(val);  
  30.         }  
  31.         getContext().getSession().setAttribute("expanded", expanded);  
  32.     }  
  33.     addModel("selected", selected);  
  34.     addModel("expanded", expanded);  
  35. }  
最后,我对treeDemo.htm进行简单布局,目的就是让所有的选项都干净地列举出来。

treeDemo.htm:

  1. <div class="box">  
  2.     <div class="header">$header</div>  
  3.     <div class="left_box">$category_tree</div>  
  4.     <div class="right_box">  
  5.     #if($expanded)  
  6.         <div class="category_box">  
  7.             <div class="category_title">类别:</div>  
  8.             <div class="category_selected">  
  9.             #foreach($eid in $expanded)  
  10.                 <a href="#" class="item">$eid</a>  
  11.             #end  
  12.             </div>  
  13.             <div class="blank"></div>  
  14.         </div>  
  15.     #end  
  16.     #if($selected)  
  17.         <div class="category_box">  
  18.             <div class="category_title">已选:</div>  
  19.             <div class="category_selected">  
  20.             #foreach($sid in $selected)  
  21.                 <a href="#" class="item">$sid</a>  
  22.             #end  
  23.             </div>  
  24.             <div class="blank"></div>  
  25.         </div>  
  26.     #end  
  27.     </div>  
  28.  </div>  
最终的效果有点原始~


不知不觉,快要下班了,今天周五,周末愉快~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约