2010年9月16日

          原創,轉載請注明出處。

          今天都在折騰project explorer,主要是在RCP里加入project explorer以后,不能正常顯示,同時刷新的時候又清空那個view,非常奇怪。

          最后按照eclipse.org的help的指導設置成功,
          http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/cnf.htm

          主要是要在自己的WorkbenchAdvisor類里面重寫的initialize(IWorkbenchConfigurer configurer)的方法。

           1     public void initialize(IWorkbenchConfigurer configurer) {
           2         IDE.registerAdapters();
           3         final String ICONS_PATH = "icons/full/";
           4         final String PATH_OBJECT = ICONS_PATH + "obj16/";
           5         Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);
           6         declareWorkbenchImage(configurer, ideBundle,
           7                 IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif",
           8                 true);
           9         declareWorkbenchImage(configurer, ideBundle,
          10                 IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
          11                         + "cprj_obj.gif"true);
          12 
          13         super.initialize(configurer);
          14         configurer.setSaveAndRestore(true);    
          15     }
          16 
          17     private void declareWorkbenchImage(IWorkbenchConfigurer configurer_p,
          18             Bundle ideBundle, String symbolicName, String path, boolean shared) {
          19         URL url = ideBundle.getEntry(path);
          20         ImageDescriptor desc = ImageDescriptor.createFromURL(url);
          21         configurer_p.declareImage(symbolicName, desc, shared);
          22     }

          然后是覆蓋getDefaultPageInput方法如下

          1 @Override
          2 public IAdaptable getDefaultPageInput() {
          3         return ResourcesPlugin.getWorkspace().getRoot();
          4      }


          這次得到的教訓就是以后有什么問題首先查詢eclipse.org,要不浪費太多時間了。

          posted @ 2010-09-16 17:02 Li Ya Qiang 閱讀(2265) | 評論 (0)編輯 收藏


          2010年8月21日

          第4章 準備

          準備階段最重要是關于HTML/CSS和Javascript如何協作的問題。

          瀏覽器初始化順序是首先腳步,然后是statements,最后是html。

          如果在js里面直接引用body里面的element就會報錯,最好是把執行腳本放到函數里調用


          function initializePage() {
                 
          var x = document.getElementById('test');
                 x.onclick 
          = function () {alert('Hello world!')};
          }
          window.onload 
          = initializePage;



          一些常見的鉤子

          id:創建鉤子最簡單的方法,每個id在文檔中只能使用一次。


          var x = document.getElementById('hook');

          class:可以為一系列的元素初始化相同的行為。

          var lists = document.getElementsByTagName('ul');
          for (var i=0; i<lists.length; i++) {
              
          if (lists[i].className != 'menutree') continue;
              
          //初始化行為
          }


          自定義屬性:即不屬于(X)HTML規范的屬性,這是不合法的,但有時為了腳本的方便使用它。

          var maxLength = this.getAttribute('maxlength');


          名/值對:即寫成如下的形式,然后從className中通過操作字符串獲取狀態。

          <textarea class="maxlength=300"></textarea>


          準備頁面:設置事件處理程序,確定訪問者狀態,設置訪問,產生內容,定義關系(relatedElement),修改文檔結構。

          <script>標簽

          defer屬性:表示正在加載中的腳本不包含任何會改變HTML的指令(如document.write)。Explorer僅在頁面已經完全加載之后才會執行擁有defer屬性的腳本。

          XHTML規定包含內容的script標簽必須定義成CDATA,它會告訴XML/HTML解釋器不要解析這些內容,而是直接送給腳本引擎。

          <script type="text/javascript">
          //<![CDATA[
          alert('Hello World!');
          //]]>
          </script>


          所有的腳本都被注冊到HTML的全局對象中,同一個變量可以在多個腳本中使用,且為最后定義的那個。

          當瀏覽器遇到script標簽時,發送一個HTTP請求去獲取腳本文件,解析其中的腳本,對HTML頁面的分析和渲染暫停,直到腳本加載完成。

          load事件會在頁面完全加載時觸發,window.onload = ; 多次設置onload會覆蓋之前的設置,需要編寫函數在同一個元素上設置多個事件處理程序。

          等待load時會因為圖片等造成延遲,這個問題很難解決,目前只有Mozilla支持的DOMContentLoaded事件,在文檔加載完成后執行,不必等待圖片。




          posted @ 2010-08-21 22:42 Li Ya Qiang 閱讀(194) | 評論 (0)編輯 收藏

          第3章 瀏覽器

          每種瀏覽器都包含一個代碼引擎或渲染引擎,它負責解釋Web頁面上的代碼,javascript解釋器是其中的一部分。

          Netscape4慘敗之后,網景公司于1998年創立了Mozilla項目,開發了Gecko引擎,現在它支持著Mozilla, Firefox, Netscape, Camino等瀏覽器。

          Explorer的代碼引擎叫做Trident,1999年3月發布的Explorer5.0是第一個支持W3C DOM和XMLHttpRequest的瀏覽器,但也是最后一個包含了主要Javascript更新的Explorer版本。

          Safari于2003年發布,它使用KHTML代碼引擎,它是Macintosh平臺的默認瀏覽器。

          Opera是一個獨立的瀏覽器,在瀏覽器大戰期間,它沒有實現DHTML,現在看來,這是一個相當英明的決定。

          4種兼容性問題

          不支持:這些出現問題的功能不是“不可或缺”的基礎功能,都能夠通過對象檢測判斷,而且瀏覽器也在努力消除這些問題,如document.sytleSheets來讀寫整個樣式表,目前Safari和Opera也增加了對其的支持。

          合理的不同看法:如defer屬性對加載腳本的要求,Exploer有獨特的理解,幸好這種問題是最少有的。

          有意為之的兼容性問題:通常是瀏覽器大戰的遺留問題,也可以通過對象檢測來判斷,一旦微軟著手實現W3C事件標準,最后一批被故意造成的兼容性問題也將得到解決。

          瀏覽器bug:這是由于編程的缺陷造成的不可預見的錯誤,它是無法解決也是無法衡量的。如Exploer6會被normalize()方法導致崩潰。

          瀏覽器兼容性問題是單純的生活的事實,它不會輕易消失,應該盡快地習慣它,至少聽任它。

          在任何情況下都不要先為某一個瀏覽器寫腳本,然后增加其他瀏覽器的支持。在項目支出就應該解決這些兼容性問題,而不是放在最后。

          對象檢測

          對象檢測是避免兼容性問題的最佳助手。它的一般方法是檢查想使用的對象,看它們是否存在,如果不存在,就結束函數。(if(!對象)),從技術上說,對象檢測是把一個對象轉換成一個布爾值。

          檢查W3C DOM:


          var W3CDOM = document.createElement && document.getElementsByTagName;


          對W3C DOM的檢測使我們可以總是假設瀏覽器也支持相關的功能,如appendChild,而省去對它的檢查。

          事件處理測試:


          function addEventSimple(obj, evt, fn) {
              
          if (obj.addEventListener) //W3C
                  obj.addEventListener(evt, fn, false);
              
          else if (obj.attachEvent) //微軟
                obj.attachEvent('on' + evt, fn);
          }

          我們期望未來的版本使用標準,所以對標準的支持應該最先檢查,事實上先檢查attachEvent,Fx等瀏覽器會報錯。

          瀏覽器檢測

          為什么瀏覽器檢測行不通?瀏覽器兼容性模式是不斷變化的,今天不支持的屬性,明天可能會支持;而且瀏覽器常常會偽裝自己的身份,以便通過瀏覽器檢測。

          瀏覽器檢測的軍備競賽

          navigator.userAgent中保存了每一個瀏覽器的識別字符串。1995年前后的Mosaic和Netscape年代中,由于 Netscape的cookie和<center>標簽等的支持,服務器端的程序員決定使用瀏覽器檢測來區分兩種瀏覽器,他們檢測識別字符串 是否從Mozilla/開始,這給javascript世界帶來了不必要的磨難。瀏覽器廠商被迫將自己的識別字符串變成從Mozilla/開始,即便是 Explorer最初進入市場時也將自己偽裝成了Netscape。瀏覽器大戰開始后,Web開發者們做出反應,他們創建了更多的瀏覽器程序來區分 Netscape和Exploer,而當戰爭結束時,已經有數不清的網站設置了檢測腳本只允許Explorer訪問,歷史重演了,一些瀏覽器如 Opera,又不得不修改自己的識別字符串來匹配Explorer,甚至將識別字符串的設置開放給用戶。

          拆解瀏覽器字符串

          Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915
          Mozilla
          /4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
          Mozilla
          /5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6
          Mozilla
          /4.0 (compatible; MSIE 6.0; Windows NT 5.2)

          第一個是Mozilla1.7.12,第二個是NT5.1(即XP)的Explorer6.0,第三個是Safari1.3.2,第四個是偽裝后的Safari1.3.2。

          userAgent:使用navigator.userAgent,而不是navigator.appName和navigator.appVersion。前者尚有一些遵循,后者都是謊言;

          Mozilla/:只能證明瀏覽器是1994年后發布的;

          /[version number]:沒有意義,每一個現代瀏覽器都生命是第4版或第5版的Mozilla;

          不規則字符串:通常被圓括號包圍,包含這非常復雜的縮寫;

          Opera:唯一支持window.opera屬性,可以檢測這個對象來判斷;

          Safari, iCab和Konqueror:不像Opera那樣勇于承擔風險,它們可以完全地偽裝自己;

          Gecko:Mozilla識別串通常都會包含Gecko,但不幸Safari等也包含;

          MSIE:沒有意義,絕大多數的瀏覽器都包含MSIE;

          版本號:Exploer和Opera允許在名字后面找到自己的版本號,而其他瀏覽器都無效,比如Mozilla的隱藏版本;

          操作系統:Windows操作系統都以Win開始,當然這不適用于偽裝的串。

          (http://www.quirksmode.org/js/detect.html)

          瀏覽器檢測的正確使用

          當你需要知道訪問者的瀏覽器,如站點統計時,這些檢測不會影響腳本邏輯。

          當我們用對象檢測時需要排除瀏覽器bug等時,可以將對象檢測和瀏覽器檢測一起使用。

          調試

          Mozilla有最好的錯誤信息,因此多在Mozilla中調試;

          使用return,alert,confirm是不錯的方法,復雜的調試可以自己創建一個錯誤控制臺;

          將bug報告給瀏覽器廠商。

          posted @ 2010-08-21 22:27 Li Ya Qiang 閱讀(167) | 評論 (0)編輯 收藏

          第二章 大背景

          javascript嵌入在一個還同時使用著HTML和CSS的環境中。

           

          2002年,Stuart Langridge提出無侵入腳本編程(unobtrusive scripting)。它代表了向基于CSS的、兼容標準的Web站點的新理論中嵌入Javascript的首次認真的嘗試。

          它應該是可用的。即給網站帶來明確的可用性好處。

          它應該是可訪問的。如果javascript失效,網頁應該依然是可閱讀和可理解的。

          它應該是容易實現的。Web開發者只需要在頁面中引入腳本本身和一個Javascript鉤子,腳本就能運行。

          它應該是分離的。只存在于自己的.js文件中,而不是散落在HTML中。

           

          一個Web頁面由如下三個層組成:HTML結構層、CSS表現層、Javascript行為層。

           

          表現與結構的分離

          所有的表現定義在一個單獨的CSS文件中,HTML中不再出現<font>標簽和用于表現的表格。一般通過腳本改變className來引用不同的

          CSS元素。CSS (display: none)用來表示文檔中的某個元素隱藏,也可以通過腳本從文檔中刪除這個元素。至于采用哪種方式,PPK推薦采用后一種方式。特別是對于form表單的時候,采用第一種方式就會提交很多無用的信息。

           

          行為與結構的分離

          所有的javascript函數都被放在一個獨立.js文件中,然后把它鏈入所需要它的HTML頁面中,HTML移除所有的事件處理程序。

          鉤子(hook)用來生命“在這里準備部署行為”的ID,它是注冊事件處理程序的一種方法。

          javascript:偽協議是復雜而骯臟的(<a href="javascript:dosomeaction()">),應該放到腳步文件中。

           

          行為和表現的分離

          行為和表現的分離是復雜的,尚沒有任何的標準。

          當若干元素部署相同的效果時,CSS是有效的,而需要創建相似但不完全相同的效果時,javascript是最有效的方法。

           

          可訪問性規則

          條理分明的HTML,如硬編碼的鏈接必須有href。

          產生對腳本用戶有意義的內容,如:

          一條發送ajax請求的鏈接可以完全用javascript生成,這樣無腳本用戶就不會看到href為#的a標簽而產生不解;

          用javascript來隱藏一段內容,而不是用css,否則無腳本用戶將永遠看不到那是什么;

          判斷是否腳本可用,然后跳轉到一個無腳本頁面時,要用location.replace而不是location.href,這樣在后退時不會再返回到有腳本頁面,事實上location.href產生了一條歷史記錄;

          針對鍵盤用戶,我們對觸發事件的元素增加focus動作;

          由于各瀏覽器都支持(但不完全支持)javascript,因此<noscript>標簽就顯得沒有意義,最好完全不用。

           

          posted @ 2010-08-21 22:21 Li Ya Qiang 閱讀(189) | 評論 (0)編輯 收藏

          第一章:目標

          javascript的目標是給Web頁面增加一個額外的可用性層。

           

          js分為6個部分:javascript核心、BOM(瀏覽器對象模型)、事件、DOM(文檔對象模型)、CSS修改、數據檢索(XMLHttpRequest)。

          他們的任務:核心使得js成為一門編程語言的基礎,控制結構變量函數和對 象;BOM給瀏覽器窗口下達指令,讀取cookie,與其他窗口進行通信;事件找出用戶執行的動作,并定義這些動作將觸發的函數;DOM學習和改變 HTML文檔的結構;CSS學習和改變HTML文檔的CSS表現;數據檢索從服務器下載新的數據而不刷新頁面。

          所有的腳本都是用核心語言、事件和DOM:等待行動,并更新頁面。

           

          ECMA(歐洲計算機制造聯合協會)對javascript核心進行標準化(ECMA1.5),這個標準應用到flash、瀏覽器、服務器以及其他尚未產生的應用上。

          W3C(萬維網協會)創建了DOM規范,它也包括事件處理和CSS修改的內容。微軟仍然沒有實現W3C的事件規范,卻使用它自己專有的事件模型。

          WHAT-WG(Web超文本應用技術工作組)正為BOM標準而工作。

          數據檢索使用的則是微軟的事實標準,W3C為數據檢索推出了XMLHttpRequest規范的第一部草案。

           

          <script標簽中允許在language="javascript1.2"中指定版本號,但自1.2版本開始Netscape和Explorer 4都宣稱支持,因此設置版本號沒有意義,事實上根本不需要這個屬性。

           

          js遵循嚴格的安全規范

          不允許訪問宿主計算機:不能讀寫除cookie外的文件系統

          同源策略:兩個窗口的頁面的Web域名必須相同,才允許跨窗口通信。同子域下可以通過設置相同的document.domain(必須設置為真實域名的一部分)進行通信。

          其他限制:不能讀取歷史對象的屬性(當可以在歷史中后退);不能設置文件上傳表單域的值;試圖關閉窗口時會詢問用戶;不允許打開一個小于100x100或處于屏幕之外或沒有標題欄的新窗口。

           

          javascript的歷史

          創始人Brendan Eich當時在Netscape工作,js公開的歷史從1996.3的Netscape2發布開始。

          Eich最初的目標是為Web開發者提供一種簡單的方式為頁面增加一些交互,這些 腳本從其他頁面復制過來并稍作調整就可以使用。最初命名為LiveScript。但Netscape出于市場的考慮選取了一個與當時流行的Java相似的 一個名字,并倉促地要求Eich“使這個語言看起來想Java”,從而誤導人們將js視為輕量級的Java版本,看成一個可以拿來搬弄技巧而不值得引起嚴 謹的程序員注意的輕巧的腳本語言。

           

          第一瘦時期

          早期的日子里,瀏覽器是一個瘦客戶端,表單驗證和鼠標滑過的效果是令人驚艷的,但它們不允許在客戶端大量進行交互,用戶被迫與服務端交互。

          1996~1999間Netscape與微軟的瀏覽器大戰開始,雙方都推出自己的 第4版,為爭奪CSS規范各不相讓。兩個瀏覽器廠商都讓javascript可以控制這些CSS聲明,于是就可以使用position:absolute 創建一個“層”,然后通過持續地改變top和left似的它在屏幕上移動,這才叫酷!這些小伎倆被冠以DHTML為人所知,即通過javascript來 改變css屬性。

          為此雙方都推出了自己專有的DOM(又稱過渡DOM,介于Netscap3DOM和W3CDOM之間),Netscape4支持document.layers,而Explorer支持document.all。

           

          第一個胖階段

          有了這些新特性,客戶端增加大量的互動:動畫、隱藏和其他視覺效果,javascript的目標轉向技術,而不是可用性,js進入胖階段。

          微軟在1999年發布Explorer5,相當好地支持了CSS和新的W3CDOM標準。盡管公司和Web開發者盡力挽救,Netscape4還是滅亡了,差不多同一時間,js的第一個胖階段結束,人們發現的不過是少量的javascript和大量的空話。

          CSS變革開始。

           

          第二個瘦階段

          瀏覽器大戰接近尾聲的時候,Web開發者們厭倦了大量的編程和變通做法,極度地想從頭開始。CSS,而不是javascript,給了他們最好的機會來完全突破過去的束縛。

          大概從2003年開始,一部分先鋒開始用一種深受CSS革命理念影響的新方式寫javascript,javascript第一次深深地潛入到全面的Web開發理論中去,而可訪問性問題終于被認識到并著手解決。

          無侵入腳本編程提出,但并沒有立即征服世界。

           

          第二個胖階段

          從服務器端悄悄地載入小塊的數據,喚醒了沉睡多年的技術構思和可用性觀 念,Jesse James Garrett的文章《Ajax:Web應用程序的新方法》開創了Ajax時代,javascript的用途又一次被重新定義,傳統web開發者創建的是 瘦的可訪問的亂糟糟的js代碼,而來自服務端開發的“資深程序員們”創建的是面向對象的,胖的,可訪問性差的ajax客戶端。焦點又被集中在技術方面,可 用性及為什么要用ajax仍很少被關注,臃腫的庫(即框架)與日俱增。

          所幸人們都開始同意并遵循已經存在的標準。

           

          2006.5數據顯示,目前共有至少134中Ajax框架,我個人認為這股熱潮已經到達了頂峰,有誰需要134種程序去做本質上是一樣的事呢?

          javascript將調整回瘦階段,那時它的用途也將再次被重新定義,當然某個時期第三個瘦階段結束后會迎來第三個胖階段.. 從根本上,這種情況只有當每個人都只認同唯一的javascript用途時才會被打破。

          posted @ 2010-08-21 22:14 Li Ya Qiang 閱讀(205) | 評論 (0)編輯 收藏


          2010年6月22日

          1 echo 和 @
          回顯命令
          @                     #關閉單行回顯
          echo off              #從下一行開始關閉回顯
          @echo off             #從本行開始關閉回顯。一般批處理第一行都是這個
          echo on               #從下一行開始打開回顯
          echo                  #顯示當前是 echo off 狀態還是 echo on 狀態
          echo.                 #輸出一個”回車換行”,空白行
                                   #(同echo, echo; echo+ echo[ echo] echo/ echo)


          2 errorlevel
          echo %errorlevel%
          每個命令運行結束,可以用這個命令行格式 查看返回碼
          默認值為0,一般命令執行出錯會設 errorlevel 為1


          3 dir
          顯示文 件夾內容
          dir                  #顯示當前目錄中的文件和子目錄
          dir /a               #顯示當前目錄中的文件和子目錄,包括隱藏文件和系統文件
          dir c: /a:d          #顯示 C 盤當前目錄中的目錄
          dir c: /a:-d         #顯示 C 盤根目錄中的文件
          dir c: /b/p         #/b只顯示文件名,/p分頁顯示
          dir *.exe /s         #顯示當前目錄和子目錄里所有的.exe文件


          4 cd
          切換目錄
          cd                  #進入根目錄
          cd                   #顯示當前目錄
          cd /d d:sdk         #可以同時更改盤符和目錄


          5 md
          創建目錄
          md d:abc          #如果 d:a 不存在,將會自動創建中級目錄
          #如果命令擴展名被停用,則需要鍵入 mkdir abc。

          6 rd
          刪除目錄
          rd abc               #刪除當前目錄里的 abc 子目錄,要求為空目錄
          rd /s/q d:temp      #刪除 d:temp 文件夾及其子文件夾和文件,/q安靜模式


          7 del
          刪除文 件
          del d:test.txt      #刪除指定文件,不能是隱藏、系統、只讀文件
          del /q/a/f d:temp*.*
          刪除 d:temp 文件夾里面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄
          del /q/a/f/s d:temp*.*
          刪除 d:temp 及子文件夾里面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄


          8 ren
          重命名命令
          ren d:temp tmp      #支持對文件夾的重命名

          9 cls
          清屏

          10 type
          顯 示文件內容
          type c:boot.ini     #顯示指定文件的內容,程序文件一般會顯示亂碼
          type *.txt           #顯示當前目錄里所有.txt文件的內容


          11 copy
          拷 貝文件
          copy c:test.txt d:test.bak
          復制 c:test.txt 文件到 d: ,并重命名為 test.bak
          copy con test.txt
          從屏幕上等待輸入,按 Ctrl+Z 結束輸入,輸入內容存為test.txt文件
          con代表屏幕,prn代表打印機,nul代表空設備
          copy 1.txt + 2.txt 3.txt
          合并 1.txt 和 2.txt 的內容,保存為 3.txt 文件
          如果不指定 3.txt ,則保存到 1.txt
          copy test.txt +
          復制文件到自己,實際上是修改了文件日期


          12 title
          設 置cmd窗口的標題
          title 新標題         #可以看到cmd窗口的標題欄變了


          13 ver
          顯示系統版本

          14 label 和 vol
          設 置卷標
          vol                  #顯示卷標
          label                #顯示卷標,同時提示輸入新卷標
          label c:system       #設置C盤的卷標為 system

          15 pause
          暫停命令

          16 rem 和 ::
          注 釋命令
          注釋行不執行操作

          17 date 和 time
          日 期和時間
          date           #顯示當前日期,并提示輸入新日期,按"回車"略過輸入
          date/t         #只顯示當前日期,不提示輸入新日期
          time           #顯示當前時間,并提示輸入新時間,按"回車"略過輸入
          time/t         #只顯示當前時間,不提示輸入新時間


          18 goto 和 :
          跳 轉命令
          :label         #行首為:表示該行是標簽行,標簽行不執行操作
          goto label     #跳轉到指定的標簽那一行


          19 find (外部命令)
          查 找命令
          find "abc" c:test.txt
          在 c:test.txt 文件里查找含 abc 字符串的行
          如果找不到,將設 errorlevel 返回碼為1
          find /i “abc” c:test.txt
          查找含 abc 的行,忽略大小寫
          find /c "abc" c:test.txt
          顯示含 abc 的行的行數


          20 more (外部命令)
          逐 屏顯示
          more c:test.txt     #逐屏顯示 c:test.txt 的文件內容


          21 tree
          顯 示目錄結構
          tree d:             #顯示D盤的文件目錄結構


          22 &
          順序執行多條命令,而不管命令是否執行成功

          23 &&
          順 序執行多條命令,當碰到執行出錯的命令后將不執行后面的命令
          find "ok" c:test.txt && echo 成功
          如果找到了"ok"字樣,就顯示"成功",找不到就不顯示


          24 ||
          順 序執行多條命令,當碰到執行正確的命令后將不執行后面的命令
          find "ok" c:test.txt || echo 不成功
          如果找不到"ok"字樣,就顯示"不成功",找到了就不顯示

          25 |
          管 道命令
          dir *.* /s/a | find /c ".exe"
          管道命令表示先執行 dir 命令,對其輸出的結果執行后面的 find 命令
          該命令行結果:輸出當前文件夾及所有子文件夾里的.exe文件的個數
          type c:test.txt|more
          這個和 more c:test.txt 的效果是一樣的


          26 > 和 >>
          輸 出重定向命令
          > 清除文件中原有的內容后再寫入
          >> 追加內容到文件末尾,而不會清除原有的內容
          主要將本來顯示在屏幕上的內容輸出到指定文件中
          指定文件如果不存在,則自動生成該文件
          type c:test.txt >prn
          屏幕上不顯示文件內容,轉向輸出到打印機
          echo hello world>con
          在 屏幕上顯示hello world,實際上所有輸出都是默認 >con 的
          copy c:test.txt f: >nul
          拷 貝文件,并且不顯示"文件復制成功"的提示信息,但如果f盤不存在,還是會顯示出錯信息
          copy c:test.txt f: >nul 2>nul
          不顯示”文件復制成功”的提示信息,并且f盤不存在的話,也不顯示錯誤提示信息
          echo ^^W ^> ^W>c:test.txt
          生成的文件內容為 ^W > W
          ^ 和 > 是控制命令,要把它們輸出到文件,必須在前面加個 ^ 符號

          27 <
          從 文件中獲得輸入信息,而不是從屏幕上
          一般用于 date time label 等需要等待輸入的命令
          @echo off
          echo 2005-05-01>temp.txt
          date <temp.txt
          del temp.txt
          這 樣就可以不等待輸入直接修改當前日期

          28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
          命 令行傳遞給批處理的參數
          %0 批處理文件本身
          %1 第一個參數
          %9 第九個參數
          %* 從第一個參數開始的所有參數

          批參數(%n)的替代已被增強。您可以使用以下語法:

               %~1          - 刪除引號("),擴充 %1
               %~f1         - 將 %1 擴充到一個完全合格的路徑名
               %~d1         - 僅將 %1 擴充到一個驅動器號
               %~p1         - 僅將 %1 擴充到一個路徑
               %~n1         - 僅將 %1 擴充到一個文件名
               %~x1         - 僅將 %1 擴充到一個文件擴展名
               %~s1         - 擴充的路徑指含有短名
               %~a1         - 將 %1 擴充到文件屬性
               %~t1         - 將 %1 擴充到文件的日期/時間
               %~z1         - 將 %1 擴充到文件的大小
               %~$PATH : 1 - 查找列在 PATH 環境變量的目錄,并將 %1
                             擴充到找到的第一個完全合格的名稱。如果環境
                             變量名未被定義,或者沒有找到文件,此組合鍵會
                             擴充到空字符串

          可以組合修定符來取得多重結果:

              %~dp1        - 只將 %1 擴展到驅動器號和路徑
              %~nx1        - 只將 %1 擴展到文件名和擴展名
              %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄里查找 %1,
                             并擴展到找到的第一個文件的驅動器號和路徑。
              %~ftza1      - 將 %1 擴展到類似 DIR 的輸出行。
          可以參照 call/? 或 for/? 看出每個參數的含意
          echo load "%%1" "%%2">c:test.txt
          生成的文 件內容為 load "%1" "%2"
          批處理文件里,用這個格式把命令行參數輸出到文件

          29 if
          判 斷命令
          if "%1"=="/a" echo 第一個參數是/a
          if /i "%1" equ "/a" echo 第一個參數是/a
          /i 表示不區分大小寫,equ 和 == 是一樣的,其它運算符參見 if/?
          if exist c:test.bat echo 存在c:test.bat文件
          if not exist c:windows (
               echo 不存在c:windows文件夾
               )
          if exist c:test.bat (
               echo 存在c:test.bat
               ) else (
               echo 不存在c:test.bat
               )

          30 setlocal 和 endlocal
          設置”命令擴展名”和”延緩環境變量擴充”
          SETLOCAL ENABLEEXTENSIONS             #啟用"命令擴展名"
          SETLOCAL DISABLEEXTENSIONS            #停用"命令擴展名"
          SETLOCAL ENABLEDELAYEDEXPANSION       #啟用"延緩環境變量擴充"
          SETLOCAL DISABLEDELAYEDEXPANSION      #停用"延緩環境變量擴充"
          ENDLOCAL                              #恢復到使用SETLOCAL語句以前的狀態
          “命令擴展名”默認為啟用
          “延 緩環境變量擴充”默認為停用
          批處理結束系統會自動恢復默認值
          可以修改注冊表以禁用"命令擴展名",詳見 cmd /? 。所以用到"命令擴展名"的程
          序,建議在開頭和結尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確
          保程序能在其它系統上正確運行
          "延緩環境變量擴充"主要用于 if 和 for 的符合語句,在 set 的說明里有其實用例程

          31 set
          設置變量
          引用變量可在變量 名前后加 % ,即 %變量名%
          set                     #顯示目前所有可用的變量,包括系統變量和自定義的變量
          echo %SystemDrive%      #顯示系統盤盤符。系統變量可以直接引用
          set p                   #顯示所有以p開頭的變量,要是一個也沒有就設errorlevel=1
          set p=aa1bb1aa2bb2      #設置變量p,并賦值為 = 后面的字符串,即aa1bb1aa2bb2
          echo %p%                #顯示變量p代表的字符串,即aa1bb1aa2bb2
          echo %p:~6%             #顯示變量p中第6個字符以后的所有字符,即aa2bb2
          echo %p:~6,3%           #顯示第6個字符以后的3個字符,即aa2
          echo %p:~0,3%           #顯示前3個字符,即aa1
          echo %p:~-2%            #顯示最后面的2個字符,即b2
          echo %p:~0,-2%          #顯示除了最后2個字符以外的其它字符,即aa1bb1aa2b
          echo %p:aa=c%           #用c替換變量p中所有的aa,即顯示c1bb1c2bb2
          echo %p:aa=%            #將變量p中的所有aa字符串置換為空,即顯示1bb12bb2
          echo %p:*bb=c%          #第一個bb及其之前的所有字符被替換為c,即顯示c1aa2bb2
          set p=%p:*bb=c%         #設置變量p,賦值為 %p:*bb=c% ,即c1aa2bb2
          set /a p=39             #設置p為數值型變量,值為39
          set /a p=39/10          #支持運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3
          set /a p=p/10           #用 /a 參數時,在 = 后面的變量可以不加%直接引用
          set /a p=”1&0″          #”與”運算,要加引號。其它支持的運算符參見set/?
          set p=                  #取消p變量
          set /p p=請輸入
          屏幕上顯示”請輸入”,并會將輸入的字符串賦值給變量p
          注意這條可以用來取代 choice 命令
          注意變量在 if 和 for 的復合語句里是一次性全部替換的,如
          @echo off
          set p=aaa
          if %p%==aaa (
               echo %p%
               set p=bbb
               echo %p%
               )
          結果將顯示
          aaa
          aaa
          因 為在讀取 if 語句時已經將所有 %p% 替換為aaa
          這里的"替換",在 /? 幫助里就是指"擴充"、"環境變量擴充"
          可以啟用” 延緩環境變量擴充”,用 ! 來引用變量,即 !變量名!
          @echo off
          SETLOCAL ENABLEDELAYEDEXPANSION
          set p=aaa
          if %p%==aaa (
               echo %p%
               set p=bbb
               echo !p!
               )
          ENDLOCAL
          結果將顯示
          aaa
          bbb
          還 有幾個動態變量,運行 set 看不到
          %CD%                   #代表當前目錄的字符串
          %DATE%                 #當前日期
          %TIME%                 #當前時間
          %RANDOM%               #隨機整數,介于0~32767
          %ERRORLEVEL%           #當前 ERRORLEVEL 值
          %CMDEXTVERSION%        #當前命令處理器擴展名版本號
          %CMDCMDLINE%           #調用命令處理器的原始命令行
          可以用 echo命令查看每個變量值,如 echo %time%
          注意 %time% 精確到毫秒,在批處理需要延時處理時可以用到

          32 start
          批 處理中調用外部程序的命令,否則等外部程序完成后才繼續執行剩下的指令

          33 call
          批處理中調用另外一個批處理的命令,否則剩下的批處理指令將不會被執 行
          有時有的應用程序用start調用出錯的,也可以call調用

          34 choice (外部命令)
          選 擇命令
          讓用戶輸入一個字符,從而選擇運行不同的命令,返回碼errorlevel為1234……
          win98 里是choice.com
          win2000pro里沒有,可以從win98里拷過來
          win2003里是choice.exe
          choice /N /C y /T 5 /D y>nul
          延時5秒


          35 assoc 和 ftype
          文件關 聯
          assoc 設置'文件擴展名'關聯,關聯到'文件類型'
          ftype 設置'文件類型'關聯,關聯到'執行程序和參數'
          當 你雙擊一個.txt文件時,windows并不是根據.txt直接判斷用 notepad.exe 打開
          而是先判斷.txt屬于 txtfile '文件類型'
          再調用 txtfile 關聯的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
          可 以在"文件夾選項"→"文件類型"里修改這2種關聯
          assoc            #顯示所有'文件擴展名'關聯
          assoc .txt       #顯示.txt代表的'文件類型',結果顯示 .txt=txtfile
          assoc .doc       #顯示.doc代表的'文件類型',結果顯示 .doc=Word.Document.8
          assoc .exe       #顯示.exe代表的'文件類型',結果顯示 .exe=exefile
          ftype            #顯示所有'文件類型'關聯
          ftype exefile    #顯示exefile類型關聯的命令行,結果顯示 exefile="%1" %*
          assoc .txt=Word.Document.8
          設置.txt為word類型的文檔,可以看到.txt文件的圖標都變了
          assoc .txt=txtfile
          恢復.txt的正確關聯
          ftype exefile="%1" %*
          恢復 exefile 的正確關聯
          如 果該關聯已經被破壞,可以運行 command.com ,再輸入這條命令

          36 pushd 和 popd
          切 換當前目錄
          @echo off
          c: & cd & md mp3        #在 C: 建立 mp3 文件夾
          md d:mp4                #在 D: 建立 mp4 文件夾
          cd /d d:mp4             #更改當前目錄為 d:mp4
          pushd c:mp3             #保存當前目錄,并切換當前目錄為 c:mp3
          popd                     #恢復當前目錄為剛才保存的 d:mp4

          37 for
          循 環命令
          這個比較復雜,請對照 for/? 來看
          for %%i in (c: d: e: f:) do echo %%i
          依次調用小括號里的每個字符串,執行 do 后面的命令
          注意%%i,在批處理中 for 語句調用參數用2個%
          默 認的字符串分隔符是"空格鍵","Tab鍵","回車鍵"
          for %%i in (*.txt) do find "abc" %%i
          對 當前目錄里所有的txt文件執行 find 命令
          for /r . %%i in (*.txt) do find "abc" %%i
          在 當前目錄和子目錄里所有的.txt文件中搜索包含 abc 字符串的行
          for /r . %%i in (.) do echo %%~pni
          顯 示當前目錄名和所有子目錄名,包括路徑,不包括盤符
          for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
          把 d:mp3 及其子目錄里的mp3文件的文件名都存到 d:mp3.txt 里去
          for /l %%i in (2,1,8) do echo %%i
          生成2345678的一串數字,2是數字序列的開頭,8是結尾,1表示每次加1
          for /f %%i in ('set') do echo %%i
          對 set 命令的輸出結果循環調用,每行一個
          for /f "eol=P" %%i in ('set') do echo %%i
          取 set 命令的輸出結果,忽略以 P 開頭的那幾行
          for /f %%i in (d:mp3.txt) do echo %%i
          顯示 d:mp3.txt 里的每個文件名,每行一個,不支持帶空格的名稱
          for /f "delims=" %%i in (d:mp3.txt) do echo %%i
          顯示 d:mp3.txt 里的每個文件名,每行一個,支持帶空格的名稱
          for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
          對 dir 命令的結果,跳過前面5行,余下的每行取第4列
          每列之間的分隔符為默認的"空格"
          可以注意到 dir 命令輸出的前5行是沒有文件名的
          for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
               echo %%a
               echo %%b
               echo %%c
               )
          對 date /t 的輸出結果,每行取1、2、3列
          第一列對應指定的 %%a ,后面的 %%b 和 %%c 是派生出來的,對應其它列
          分 隔符指定為 - 和"空格",注意 delims=- 后面有個"空格"
          其中 tokens=1,2,3 若用 tokens=1-3 替換,效果是一樣的
          for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
          取 第2列給 %%a ,其后的列都給 %%b


          38 subst (外部命令)
          映射磁盤。
          subst z: serverd      #這樣輸入z:就可以訪問serverd了
          subst z: /d              #取消該映射
          subst                    #顯示目前所有的映時

          39   xcopy (外部命令)
          文 件拷貝
          xcopy d:mp3 e:mp3 /s/e/i/y
          復制 d:mp3 文件夾、所有子文件夾和文件到 e: ,覆蓋已有文件
          加 /i 表示如果 e: 沒有 mp3 文件夾就自動新建一個,否則會有詢問

          posted @ 2010-06-22 11:20 Li Ya Qiang 閱讀(739) | 評論 (0)編輯 收藏


          2010年3月2日

          來自http://www.aygfsteel.com/fingki/archive/2010/03/02/314268.html

          在使用Iterator處理Collection時,注意java.util.ConcurrentModificationException。
          1.如果你僅僅是對collection進行遍歷查詢,那么不必擔心什么。
          2.但如果你在遍歷過程中要對collection進行刪除,那么你就要注意了。
          For example:
          private void testDel() {  
          1.     List<String> list = new ArrayList<String>();  
          2.     for (int i = 0; i < 10; i++) {  
          3.         String str = "td" + i;  
          4.         list.add(str);  
          5.     }  
          6.   
          7.     for (Iterator it = list.iterator(); it.hasNext();) {  
          8.         String str = (String) it.next();  
          9.         if (str.equals("td5")) {  
          10.             // list.remove(str);  // 刪除方法一 
          11.             it.remove();  // 刪除方法二 
          12.         }  
          13.     }  

          上面的代碼運行沒有問題,但如果你用“方法一”替代“方法二”,則會出現 java.util.ConcurrentModificationException。
          (用for-each遍歷也會出個類似問題)
          具體原因是可以看一下先看看List中的remove方法源碼:
          1. public boolean remove(Object o) {  
          2.     if (o == null) {  
          3.         for (int index = 0; index < size; index++)  
          4.             if (elementData[index] == null) {  
          5.                 fastRemove(index);  
          6.                 return true;  
          7.             }  
          8.     } else {  
          9.         for (int index = 0; index < size; index++)  
          10.             if (o.equals(elementData[index])) {  
          11.                 fastRemove(index);  
          12.                 return true;  
          13.             }  
          14.     }  
          15.     return false;  
          16. }  
          17.   
          18. private void fastRemove(int index) {  
          19.     modCount++; // 特別注意這里,這里只增加了modCount的值  
          20.     int numMoved = size - index - 1;  
          21.     if (numMoved > 0)  
          22.         System.arraycopy(elementData, index + 1, elementData, index,  
          23.                 numMoved);  
          24.     elementData[--size] = null; // Let gc do its work  

          接著看。刪除后得到下一個元素的代碼,it.next():  it為AbstractList的內部類Iterator的一個實例。
          1. public E next() {  
          2.     checkForComodification();  
          3.     try {  
          4.         E next = get(cursor);  
          5.         lastRet = cursor++;  
          6.         return next;  
          7.     } catch (IndexOutOfBoundsException e) {  
          8.         checkForComodification();  
          9.         throw new NoSuchElementException();  
          10.     }  
          11. }  
          12.   
          13. final void checkForComodification() {  //注意這個方法
          14.     if (modCount != expectedModCount)  //檢查這兩個值是否相同
          15.         throw new ConcurrentModificationException();  

          最后看Iterator的remove()方法的源代碼:
          1. public void remove() {  
          2.     if (lastRet == -1)  
          3.         throw new IllegalStateException();  
          4.     checkForComodification();  
          5.     try {  
          6.         AbstractList.this.remove(lastRet);  
          7.         if (lastRet < cursor)  
          8.             cursor--;  
          9.         lastRet = -1;  
          10.         expectedModCount = modCount; // 設置expectedModCount  
          11.     } catch (IndexOutOfBoundsException e) {  
          12.         throw new ConcurrentModificationException();  
          13.     }  
          14. }  
          15.   
          16. final void checkForComodification() {  
          17.     if (modCount != expectedModCount)  
          18.         throw new ConcurrentModificationException();  

          這下就明白了,list的remove方法只修改了modCount值,而iterator的remove能同步modCount和 expectedModCount.

          posted @ 2010-03-02 16:50 Li Ya Qiang 閱讀(210) | 評論 (0)編輯 收藏


          2009年5月25日

          (轉帖)
          URL中的特殊字符     
            有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了。編碼的格式為:%加字符的ASCII碼,即一個百分號%,后面跟對應字符的ASCII(16進制)碼值。例如   空格的編碼值是"%20"。   
            下表中列出了一些URL特殊符號及編碼   
                
              
                                                                                  十六進制值     
            1.   +         URL   中+號表示空格                                 %2B     
            2.   空格   URL中的空格可以用+號或者編碼           %20     
            3.   /         分隔目錄和子目錄                                   %2F       
            4.   ?         分隔實際的   URL   和參數                         %3F       
            5.   %         指定特殊字符                                           %25       
            6.   #         表示書簽                                                   %23       
            7.   &         URL   中指定的參數間的分隔符               %26       
            8.   =         URL   中指定參數的值                               %3D     

          posted @ 2009-05-25 10:19 Li Ya Qiang 閱讀(394) | 評論 (0)編輯 收藏


          2008年7月13日

          來自http://cary.javaeye.com/blog/32419

          ECLIPSE PLUG-IN RCP
          此部分有的是自己的開發中的經驗,有的是在論壇中看到別人的經驗。我在這里把部分覺得好的部分收集,整理。希望對大家有幫助。
          1:登陸對話框
          public Object run(Object args) throws Exception {
          Display display = PlatformUI.createDisplay();

          try {
          Platform.endSplash();
          /**
          * 登錄
          */
          if (!login())
          return IPlatformRunnable.EXIT_OK;

          logger.info("正在初始化客戶端......");
          //
          InitUIProgress.addInfor("初始化主界面...");
          int returnCode = PlatformUI.createAndRunWorkbench(display,
          new ApplicationWorkbenchAdvisor());
          if (returnCode == PlatformUI.RETURN_RESTART) {
          return IPlatformRunnable.EXIT_RESTART;
          }

          return IPlatformRunnable.EXIT_OK;
          } finally {
          display.dispose();
          }
          }



          2:該寫actionBar 的 ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window)

          IActionBarConfigurer configurer = getActionBarConfigurer();
          final IWorkbenchWindow window = configurer.getWindowConfigurer().getWindow();

          MenuManager perspectiveMenu = new MenuManager("Open Perspective");
          IContributionItem perspectiveList = ContributionItemFactory.PERSPECTIVES_SHORTLIST.create(window);
          perspectiveMenu.add(perspectiveList);
          windowMenu.add(perspectiveMenu);

          3:讓其viewpart顯示流線型
          在 WorkbenchWindowAdvisor 中的preWindowOpen()中設置
          //顯示特效
          PlatformUI.getPreferenceStore().setDefault(
          IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, true);
          //不顯示傳統的窗口
          PlatformUI.getPreferenceStore().setDefault(
          IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS,
          false);


          4:可以使用action來做, 調用下面的方法:

          IWorkbench.showPerspective(String perspectiveId, IWorkbenchWindow window)
          or
          IWorkbench.showPerspective(String perspectiveId, IWorkbenchWindow window, IAdaptable input)

          IWorkbench和IWorkbenchWindow對象都可以在ViewPart中找到.

          5:定義熱鍵
          getShell().getDisplay().addFilter(SWT.KeyDown, globEvent);

          將plugin.xml里面hotkey
          <extension
          point="org.eclipse.ui.bindings">
          <!--key
          commandId="org.eclipse.ui.file.exit"
          schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
          sequence="CTRL+X">
          </key -->
          </extension>

          6.如何或得RCP中的一些路徑問題
          從插件中獲得絕對路徑:
          AaaaPlugin.getDefault().getStateLocation().makeAbsolute().toFile().getAbsolutePath());


          通過文件得到Project:

          IProject project = ((IFile)o).getProject();


          通過文件得到全路徑:

          String path = ((IFile)o).getLocation().makeAbsolute().toFile().getAbsolutePath();



          得到整個Workspace的根:

          IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();


          從根來查找資源:

          IResource resource = root.findMember(new Path(containerName));

          從Bundle來查找資源:

          Bundle bundle = Platform.getBundle(pluginId);
          URL fullPathString = BundleUtility.find(bundle, filePath); //BundleUtility類在ui里,非UI的沒法用

          還有其它方法:URL fileURL = FileLocator.find(bundle, new Path("some file relative path"), null);


          得到Appliaction workspace:

          Platform.asLocalURL(PRODUCT_BUNDLE.getEntry("")).getPath()).getAbsolutePath();

          得到runtimeworkspace:
          Platform.getInstanceLocation().getURL().getPath();

          從編輯器來獲得編輯文件:

          IEditorPart editor = ((DefaultEditDomain)(parent.getViewer().getEditDomain())).getEditorPart();
          IEditorInput input = editor.getEditorInput();
          if(input instanceof IFileEditorInput){
          IFile file = ((IFileEditorInput)input).getFile();
          }

          得到plugin.xml中的所以ACTION
          IContributionItem[] items = getViewSite().getActionBars().getMenuManager().getItems();
          for (int i = 0; i < items.length; i++) {
          manager.add(items[i]);
          }

          posted @ 2008-07-13 10:07 Li Ya Qiang 閱讀(545) | 評論 (0)編輯 收藏

              (本人原創,轉載請注明出處)  

                 上周五在項目中遇到一個棘手的問題,需要在自己定義的view中得到在workbechwindow里注冊到menu的action。這個action不是通過擴展擴展點actionset定義的,就是通過繼承Action對象來定義的。經過一番思索后,感覺有兩條路可走:

               1.  讓這個action繼承IPartListener接口,并注冊到那個view中,這樣在view中可以通過getListeners方法得到注冊到這個view中的所有Listener列表,再通過id找到這個action,并改變這個action的狀態。但是在后來遇到一個問題,這個action由于是在perspective的ApplicatonActionBarAdvisor的方法中實例化的,比view先初始化,故在aciton中無法得到這個view的實例,因此無法把action注冊到view中。不知道是不是我的理解有誤,如果這條路可以走通,請達人幫忙。

              2. 然后是在view中調用相應的方法來取得這個action。剛開始時,通過this.getSite().getWorkbenchWindow()方法始終無法得到actionbars,只有強制類型轉換到WorkbenchWindow才能得到actionbars,主要是通過以下代碼:

          WWinActionBars winBars =  ((WorkbenchWindow) this.getSite().
                                  getWorkbenchWindow()).getActionBars();
          IAction action 
          = winBars .getGlobalActionHandler("actionID");
          action.setEnable(
          true);
                
                 但是WWinActionBars類并沒有實現通過action的ID得到這個action對象的getGlobalActionHandler方法,該method只返回null,因此此方法也無法達成目標。

                 就在我無計可施的時候,只能想到用最笨的辦法來實現了,就是在view中得到管理這個aciton的MenuManager,并通過MenuManager來得到和action相關聯的MenuItem,最后改變MenuItem的狀態來改變action。主要代碼如下:

                

                  WWinActionBars winBars = ((WorkbenchWindow) this.getSite().
                                                            getWorkbenchWindow()).getActionBars();
                  IContributionItem[] contributionItems 
          = winBars .
                                                            getMenuManager().getItems();
                  
          for(int i = 0; i < contributionItems .length; i++) {
                      
          if (contributionItems[i] instanceof MenuManager) {
                          MenuManager menuM
          = (MenuManager)contributionItems [i];
                          
          if (menuM .getId().equals("menumanagerID")) {
                              MenuItem[] menuItems = menuM.getMenu().getItems();
                              
          for (int j = 0; j < menuItems.length; j++) {
                                  
          if (menuItems [j].getText().equals("actionText")) {
                                     
          menuItems [j].setEnable(true);                   
                                  }                            
                              }       

                          }
                      }
                  }
             
                
                 經過這次研究,對SWT和JFace的menu管理有了更深的理解,如果中間有什么問題,請達人們指出來,大家一起學習,謝謝!

          posted @ 2008-07-13 09:55 Li Ya Qiang 閱讀(2136) | 評論 (0)編輯 收藏


          僅列出標題  

          posts - 10, comments - 0, trackbacks - 0, articles - 2

          Copyright © Li Ya Qiang

          主站蜘蛛池模板: 阳江市| 道真| 新竹县| 宜宾市| 垦利县| 抚宁县| 砚山县| 文山县| 盐津县| 屏南县| 彭泽县| 泰安市| 章丘市| 广丰县| 夏津县| 修水县| 苏尼特左旗| 阳朔县| 荔波县| 临沭县| 靖宇县| 永年县| 屯昌县| 昔阳县| 修文县| 无棣县| 兰州市| 淅川县| 论坛| 曲阜市| 门头沟区| 桓台县| 富源县| 共和县| 托克托县| 巨野县| 翁源县| 巫溪县| 罗甸县| 连州市| 利津县|