日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何使用GWT-Ext 進(jìn)行RIA開(kāi)發(fā) - GWT - AJAX - JavaEye論壇

 goldbomb 2007-11-14

個(gè)人覺(jué)得,GWT的客戶端表現(xiàn)并不是Gwt這個(gè)項(xiàng)目最關(guān)心的方向,所以要做出表現(xiàn)豐富的界面,要花去不少心思,當(dāng)你為做一個(gè)“可排序的Grid”被搞得焦頭爛額時(shí),想想EXT,DOJO,只有艷羨地分了。

GWT-Extsanjiv.jivan為了豐富GWT的客戶端表現(xiàn)而貢獻(xiàn)的開(kāi)源項(xiàng)目。項(xiàng)目結(jié)合了當(dāng)前客戶端表現(xiàn)和用戶體驗(yàn)都相當(dāng)完善的Ext,提供了一種操作性很強(qiáng)的RIA開(kāi)發(fā)方式。

作者應(yīng)該花了不少心思在項(xiàng)目上,更新很頻繁,大概不到1個(gè)月就有新的版本問(wèn)世,目前項(xiàng)目的版本為GWT-Ext 0.9.3,是 Ext 1.1.1 和 GWT 1.4 Final 的結(jié)合,在 Ext 方面實(shí)現(xiàn)了大多數(shù)常用的控件,如Grid、Tree、Form、TabPanel等等。具體實(shí)現(xiàn)效果可以查看項(xiàng)目中的 Showcase Demo

以下結(jié)合一個(gè)例子來(lái)演示一下如何使用GWT-Ext 做實(shí)際開(kāi)發(fā)。

一定要認(rèn)真閱讀項(xiàng)目中的 GettingStarted ,下面起初的幾段其實(shí)就是該文的中文譯本。

一、在Gwt項(xiàng)目中集成GWT-Ext

1.下載gwtext-0.9.3.zip,之后解壓,將其中的 gwtext.jar 附加到當(dāng)前GWT項(xiàng)目(Tree)的BuildPath中。

2.下載ext-1.1.1.zip (注意:暫時(shí)還不支持最新的2.0版本),將的ext-all.js、ext-core.js以及resources和adapter兩個(gè)目錄拷貝到module的public中的js/ext位置。對(duì)Ext熟悉的話,可以只拷貝需要的文件而不必載入所有的資源文件。

3.修改GWT項(xiàng)目中module的html頁(yè)面,添加Ext資源,修改后的html頁(yè)面可能是這樣:

html代碼
  1. <html>  
  2.     <head>  
  3.        
  4.         <title>Wrapper HTML for Treetitle>  
  5.   
  6.         <meta name='gwt:module' content='showcase.Tree'/>  
  7.   
  8.         <link type="text/css" rel='stylesheet' href='Tree.css'/>  
  9.            
  10.         <link rel="stylesheet" type="text/css" href="js/ext/resources/css/ext-all.css"/>  
  11.         <link rel="stylesheet" type="text/css" href="js/ext/resources/css/xtheme-aero.css" />  
  12.         <script type="text/javascript" src="js/ext/adapter/yui/yui-utilities.js">script>  
  13.         <script type="text/javascript" src="js/ext/adapter/yui/ext-yui-adapter.js">script>  
  14.         <script type="text/javascript" src="js/ext/ext-all.js">script>  
  15.            
  16.     head>  
  17.   
  18.     <body>  
  19.   
  20.         <script language="javascript" src="gwt.js">script>  
  21.   
  22.         <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0">iframe>  
  23.   
  24.     body>  
  25. html>  

 

4.編輯項(xiàng)目的Tree.gwt.xml文件,添加以下

xml 代碼
  1. <inherits name='com.gwtext.GwtExt'/>  

通過(guò)以上步驟,你就可以寫(xiě)接近Ext功能的客戶端界面了,同時(shí)也具有了Gwt的各種開(kāi)發(fā)優(yōu)勢(shì)了,比如Java方式開(kāi)發(fā),清晰的RPC(這點(diǎn)尤其是在客戶端需要獲取服務(wù)器端數(shù)據(jù)信息時(shí)尤其方便)等等。

二、實(shí)例

下面我們就編寫(xiě)Showcase Demo 中的Tree節(jié)點(diǎn)下的Two Trees Drag & Drop,例子實(shí)現(xiàn)的是兩個(gè)Tree中節(jié)點(diǎn)的任意拖放(再次感嘆Ext的豐富表現(xiàn))。

Tree.java代碼如下,可直接拷貝到查看效果。

java 代碼
  1. package showcase.client;   
  2.   
  3. import com.google.gwt.core.client.EntryPoint;   
  4. import com.google.gwt.user.client.ui.HorizontalPanel;   
  5. import com.google.gwt.user.client.ui.RootPanel;   
  6. import com.gwtext.client.widgets.tree.AsyncTreeNode;   
  7. import com.gwtext.client.widgets.tree.AsyncTreeNodeConfig;   
  8. import com.gwtext.client.widgets.tree.TreePanel;   
  9. import com.gwtext.client.widgets.tree.TreeNode;   
  10. import com.gwtext.client.widgets.tree.DropNodeCallback;   
  11. import com.gwtext.client.widgets.tree.TreePanelConfig;   
  12. import com.gwtext.client.widgets.tree.XMLTreeLoader;   
  13. import com.gwtext.client.widgets.tree.XMLTreeLoaderConfig;   
  14. import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;   
  15. import com.gwtext.client.dd.*;   
  16. /**  
  17.  * Entry point classes define onModuleLoad().  
  18.  */  
  19. public class Tree implements EntryPoint {   
  20.     public void onModuleLoad() {   
  21.         RootPanel rootPanel = RootPanel.get();   
  22.         HorizontalPanel horizontalPanel = new HorizontalPanel();   
  23.         rootPanel.add(horizontalPanel);   
  24. //      create source countried tree   
  25.         final TreePanel treePanel = new TreePanel("coutries-grouped"new TreePanelConfig() {   
  26.             {   
  27.                 setAnimate(true);   
  28.                 setEnableDD(true);   
  29.                 setContainerScroll(true);   
  30.                 setRootVisible(true);   
  31.             }   
  32.         });   
  33.   
  34.         final XMLTreeLoader loader = new XMLTreeLoader(new XMLTreeLoaderConfig() {   
  35.             {   
  36.                 setDataUrl("countries-grouped.xml");   
  37.                 setMethod("get");   
  38.                 setRootTag("countries");   
  39.                 setFolderTitleMapping("@title");   
  40.                 setFolderTag("continent");   
  41.                 setLeafTitleMapping("@title");   
  42.                 setLeafTag("country");   
  43.                 setQtipMapping("@qtip");   
  44.                 setIconMapping("@icon");   
  45.             }   
  46.         });   
  47.   
  48.         AsyncTreeNode root = new AsyncTreeNode("Countries"new AsyncTreeNodeConfig() {   
  49.             {   
  50.                 setLoader(loader);   
  51.             }   
  52.         });   
  53.   
  54.         treePanel.setRootNode(root);   
  55.         treePanel.render();   
  56.   
  57.         root.expand();   
  58.         treePanel.expandAll();   
  59.   
  60. //      create target vacation tree   
  61.         final TreePanel tripTreePanel = new TreePanel("vacation-tree"new TreePanelConfig() {   
  62.             {   
  63.                 setAnimate(true);   
  64.                 setEnableDD(true);   
  65.                 setContainerScroll(true);   
  66.                 setRootVisible(true);   
  67.             }   
  68.         });   
  69.   
  70.         final XMLTreeLoader tripLoader = new XMLTreeLoader(new XMLTreeLoaderConfig() {   
  71.             {   
  72.                 setDataUrl("trip.xml");   
  73.                 setMethod("get");   
  74.                 setRootTag("vacations");   
  75.                 setFolderIdMapping("@title");   
  76.                 setFolderTag("trip");   
  77.                 setQtipMapping("@qtip");   
  78.                 setIconMapping("@icon");   
  79.                 setAttributeMappings(new String[]{"@trip"});   
  80.             }   
  81.         });   
  82.   
  83.         AsyncTreeNode tripRoot = new AsyncTreeNode("Places to Visit"new AsyncTreeNodeConfig() {   
  84.             {   
  85.                 setLoader(tripLoader);   
  86.             }   
  87.         });   
  88.   
  89.         tripTreePanel.setRootNode(tripRoot);   
  90.         tripTreePanel.render();   
  91.   
  92.         tripRoot.expand();   
  93.         tripTreePanel.expandAll();   
  94.   
  95. //      add trip tree listener that handles move / copy logic   
  96.         tripTreePanel.addTreePanelListener(new TreePanelListenerAdapter() {   
  97.             public boolean doBeforeNodeDrop(TreePanel treePanel, TreeNode target, String point, DragDrop source, TreeNode dropNode, DropNodeCallback dropDropNodeCallback) {   
  98.                 if("true".equals(target.getAttribute("trip"))) {   
  99.                 }   
  100.                 return true;   
  101.             }   
  102.         });   
  103.         horizontalPanel.add(treePanel);   
  104.         horizontalPanel.add(tripTreePanel);   
  105.     }   
  106. }   

 注意:例子中需要的兩個(gè)數(shù)據(jù)文件需放置于public目錄,熟悉Ext的應(yīng)該很清楚。

 

以上示例只是將該種開(kāi)發(fā)方式的流程順了一下,窺一斑以示全貌,Ext各種豐富的表現(xiàn)都可以實(shí)現(xiàn)。閑下來(lái),再寫(xiě)一下將數(shù)據(jù)提供(其實(shí)就是一些多維數(shù)據(jù)而已)方式改為RPC,這樣開(kāi)發(fā)流程就完整了。

可以下載示例程序運(yùn)行一下,證明我沒(méi)騙你

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多