kermart

          k

           

          2012年7月26日

          Eclipse版本、插件介紹

          Eclipse IDE for Java Developers 是Eclipse的platform加上JDT插件,用來java開發的

          Eclipse IDE for Java EE Developers 應該是Eclipse的platform加上WTP插件,用來java企業級開發的

          Eclipse IDE for C/C++ Developers 是Eclipse的platform加上CDT插件,用來做C和C++開發的

          Eclipse for RCP/Plug-in Developers 是Eclipse的SDK,主要用來插件開發

          Eclipse Classic 就是原來的Eclipse,是Eclipse的基本版,還是主要用來開發java

          Eclipse的功能是通過插件來實現的,下面了解主要插件的功能。

          JDT(Java Development Tools):Java設計工具。
          PDT:用于開發PHP語言的工具。
          C/C++ IDE:用于設計C/C++項目。
          PDE(Plugin Development Environment):插件設計環境,用于設計自定義插件。
          Platform:Eclipse的核心運行平臺。
          EMF(Eclipse Modeling Framework):Eclipse模型框架。
          GEF(Graphical Editor Framework):圖形編輯框架,用于輔助圖形設計。
          UML2:UML編輯器。

          WTP(Web Tools Platform ):是一個開發J2EE Web應用程序的工具集。WTP包含以下工具:
               * 一個源碼編輯器可以用來編輯HTML, Javascript, CSS, JSP, SQL, XML, DTD, XSD, 和WSDL。
               * 一個圖形編輯器用來編輯XSD與WSDL。
               * J2EE項目構建器和一個J2EE向導工具。
               * 一個Web服務創建向導和管理器,和WS-I 測試工具。
               * 一個數據庫訪問,查詢工具等。
            WTP由兩個子項目構成:WST(Web標準工具集) 與JST(J2EE標準工具集)
          VE(Visual Editor):可視化圖形編輯組件,用于提供AWT/SWT/Swing的圖形編輯。
          J2EE Standard Tools:用于設計J2EE應用程序的插件。
          WST-Web Standards Tools:用于設計Web應用程序的插件。
          Eclipse Test and Performance Tools Platform:用于調試,單元測試和測試項目的插件。
          Business Intelligence and Reporting Tools(BIRT):商業智能和商業報表開發插件,它包括ChartEngine(圖形引擎)、Report Framework(報表框架)、Runtime ENV(運行時環境)。
          AJDT-AspectJ Development Tools:用于開發AOP(面向方面編程)的開發Eclipse插件。
          AspectJ:用于開發AOP的開發環境。
          CME(Concern Manipulation Environment):用于開發AOP的一組可視化工具插件。

          posted @ 2012-07-26 14:32 kermart 閱讀(314) | 評論 (0)編輯 收藏

          分層Pane結構與Swing組件高級特性的實現

            這個題目起的有點難懂,但也實在想不出更好的題目來。所謂分層Pane結構是指JFrame/JApplet/JDialog等Swing頂層容器的JRootPane/JLayeredPane/GlassPane/ContentPane結構。所謂Swing組件高級特性其實是指某些組件的特殊功能的實現,比如彈出菜單、Tooltip、JComboBox的下拉窗口、Drag and Drop實現、Docking Pallete窗口等等。這些特性同普通組件不同,它們往往需要動態的變化、覆蓋其他組件,它們之間存在一定層次關系。那么Swing中是怎么樣實現這些功能呢?
            一直以來想寫一篇文章來描述這個關鍵結構,但每次總被自己的語言表達能力所限制。Swing這個精巧結構是我嘆服的原因之一。雖然一般的GUI系統設計原理我都知道,但是細節如此處精細卻不是一開始就能清楚的。我在2000年以前曾經寫過大量基于AWT Canvas的自定義組件,當時認為Swing的自定義組件也不過如此,原理不過也是給我一個刷子,我給你畫出來。但是上述所說的這些特性,卻從來沒能實現過。我想過很多方法,做過很多實驗,但終究沒有想透這一層。之后某次偶然機會,看到了下面這張著名的圖,使我豁然開朗。讓我又一次理解了創新需要跳出舊的思維模式勇氣和智慧。

            簡單來說Swing中這些頂層容器的多Pane結構是實現這些特性的基礎。這些Pane實際是一些特殊的JComponent,它們之間存在包含被包含、覆蓋被覆蓋的樹狀多層次結構。我重新畫了上面這張圖,使得其更具體、更直觀,更容易理解些:

          其實有了這張圖,加上圖形系統中Z-order的概念,就不難理解并實現上面提到的特性。Z-order概念和圖形學中Z深度是一致的。離觀察點近的物體總是會遮擋離觀察點遠的物體。物體所在法平面離觀察點的距離就是所謂Z深度。Swing中通過先畫出Z-order遠(小)的組件,再畫Z-order近(大)的組件的方法實現組件之間的遮擋關系。每個組件所在平面的都有一個數字描述其位置,這個位置同三維坐標系中的Z軸類似,離觀察者越近,坐標越大:

            Swing的頂層容器都包含有一個JRootPane,該JRootPane是一切Swing組件起點。JRootPane中包含了一個JLayeredPane和一個GlassPane。GlassPane和JLayeredPane都是充滿JRootPane的。GlassPane缺省情況下是不可見的,因此我們看到都是JLayeredPane。GlassPane如果是可見的,它Z-order大于任何其他組件,因此它會覆蓋住整個窗口,使得所有的鼠標事件都被它截獲。另外通常可見情況下它是透明的,因此你能仍然看到JLayeredPane上面的一切,但是JLayeredPane上面的組件都得不到鼠標事件。
          GlassPane這個奇怪的組件主要是用來實現Drag & Drop以及跨組件渲染用的。NetBeans和Eclipse中哪種常見的Docking Frame的實現就和這種組件相關。這些工程、文件、源代碼的窗口其實不過是普通的Swing組件,它們本身并不能實現這種拖拽功能。鼠標在它們上面標題欄區域按下之后,標題欄組件會檢測到這種事件,經過粘連性判斷后,如果發現這些鼠標事件目的是拖拽窗口,這種Docking系統就會將拖拽區域(即所謂的ClientArea)的GlassPane設置為可見,于是下面的一些列拖拽鼠標事件就被這個GlassPane所接管了過去。GlassPane是覆蓋于應用程序ClientArea的透明組件,它處理這些事件時計算出當前鼠標位置所蘊含著的拖拽動作,并根據這些動作畫出相應的焦點矩形。NetBeans的Docking Framework一個拖拽過程如下圖所示.注意GlassPane是背景透明的,所以可以在上面畫背景透明的焦點矩形:

            JLayeredPane是實現彈出式窗口或類似Pallete浮動窗口的主要組件。如同它的名字一樣,它將自己的內部結構也分成許多亞層。在使用它的add(Component, Object)方法加入組件時,第二個參數是一個Integer值,這個值決定了加入的層。這個值相當于前面所說的Z-order值。目前主要有下面幾個預定義值:
          public final static Integer DEFAULT_LAYER = new Integer(0);
          這層加入的缺省層。
            public final static Integer PALETTE_LAYER = new Integer(100);
          這層是定義Palette窗口的層。那種浮動選項窗口屬于這一層。
            public final static Integer MODAL_LAYER = new Integer(200);
          這層是模態對話框的層。這個模態對話框應該是指JInternalFrame的模態對話框,而不是JDialog。
            public final static Integer POPUP_LAYER = new Integer(300);
          這層是菜單、下拉框窗口、Tooltip等窗口浮動的層。
            public final static Integer DRAG_LAYER = new Integer(400);
          這一層是拖拽層,組件可以在這一層被托拽。
            public final static Integer FRAME_CONTENT_LAYER = new Integer(-30000);
          這一層是ContentPane和MenuBar所在的層。注意它非常小,前面所有層的組件都會覆蓋這一層的組件。我們知道ContentPane是所有應用程序組件所在的地方。
            JLayeredPane直接包含有ContentPane組件。應用程序如果定了MenuBar,JLayeredPane還包含MenuBar。注意JLayeredPane本身沒有布局管理器,它對組件的布局是由它的父容器JRootPane的布局管理器RootLayout來完成的。簡單來說,所在層數值小的組件有可能被高層組件所覆蓋。Swing將不同類型的組件放置在不同層面上,就實現了文章一開始提到的特性:菜單、浮動窗口、下拉框窗口和Tooltip等。當然這些窗口有可能不是JLayeredPane上的輕量級Swing組件,當它們的邊界超過頂層容器的窗口時,這些窗口的就變成了重量級AWT窗口。這在上一篇文章《如何混排Swing和AWT組件中已經提到過。
            下面是這些Pane組件之間的樹狀包含關系圖:

            本文的目的是講述Swing的這種組件層次結構,并不是講述如何使用JLayeredPane和GlassPane來實現某中特殊的功能。如果需要學習如何使用它們實現某些特殊效果,Java Tutorial的Swing部分提供了詳盡的編程資料。Java Tutorial的Swing部分編程在:
            如何使用RootPane、GlassPane和JLayeredPane分別見下面的章節:

          posted @ 2012-07-26 11:21 kermart 閱讀(1245) | 評論 (0)編輯 收藏

          NetBeans中自動生成JFrame的布局管理器

          NetBeans自動生成的JFrame窗體默認使用了自由設計的布局GroupLayout。


             默認添加的面板(JPanel)等容器也都是用了自由布局GroupLayout方式。


              這將導致我們自己在代碼中動態添加的組件無法顯示在窗體上,因此需要手工重設容器的布局方式。(對需要動態添加的組件,可以先畫一個面板,重設布局,再在面板上添加自己的組件。)(即重新彈出一個窗口)


               NetBeans對GridBagLayout提供了可定制的布局,對GridLayout,BorderLayout,FlowLayout也有比較好的支持。絕對布局,需要NetBeans的包支持,不建議使用。


               對BoxLayout支持不夠好,不可調間隙。自由布局和NULL布局,不會自動適應窗體變化。


               由于GridBagLayout布局在改變窗體大小的時候,可以基本保持原形,建議在NetBeans中設計窗體時使用GridBagLayout布局,也可以結合GridLayout,BorderLayout,FlowLayout進行布局

          posted @ 2012-07-26 11:02 kermart 閱讀(1787) | 評論 (0)編輯 收藏

          2012年7月20日

          Freemarker

          廣大 Freemarker 用戶可以更深入地了解一下 Freemarker  


          FreeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫

          FreeMarker被設計用來生成HTML Web頁面,特別是基于MVC模式的應用程序

          雖然FreeMarker具有一些編程的能力,但通常由Java程序準備要顯示的數據,由FreeMarker生成頁面,通過模板顯示準備的數據



          FreeMarker不是一個Web應用框架,而適合作為Web應用框架一個組件

          FreeMarker與容器無關,因為它并不知道HTTP或Servlet;FreeMarker同樣可以應用于非Web應用程序環境

          FreeMarker更適合作為Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標記庫

          FreeMarker是免費的

          而且你還可以通過Eclipse的插件來編輯FreeMarker,經過驗證,FreeMarker 最好的 Eclipse 編輯插件是 JBoss Tools

          FreeMarker特性

          1、通用目標

          能夠生成各種文本:HTML、XML、RTF、Java源代碼等等

          易于嵌入到你的產品中:輕量級;不需要Servlet環境

          插件式模板載入器:可以從任何源載入模板,如本地文件、數據庫等等

          你可以按你所需生成文本:保存到本地文件;作為Email發送;從Web應用程序發送它返回給Web瀏覽器

          2、強大的模板語言

          所有常用的指令:include、if/elseif/else、循環結構

          在模板中創建和改變變量

          幾乎在任何地方都可以使用復雜表達式來指定值

          命名的宏,可以具有位置參數和嵌套內容

          名字空間有助于建立和維護可重用的宏庫,或者將一個大工程分成模塊,而不必擔心名字沖突

          輸出轉換塊:在嵌套模板片段生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你可以定義自己的轉換

          3、通用數據模型

          FreeMarker不是直接反射到Java對象,Java對象通過插件式對象封裝,以變量方式在模板中顯示

          你可以使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾

          4、為Web準備

          在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構

          能夠集成到Model2 Web應用框架中作為JSP的替代

          支持JSP標記庫

          為MVC模式設計:分離可視化設計和應用程序邏輯;分離頁面設計員和程序員

          5、智能的國際化和本地化

          字符集智能化(內部使用UNICODE)

          數字格式本地化敏感

          日期和時間格式本地化敏感

          非US字符集可以用作標識(如變量名)

          多種不同語言的相同模板

          6、強大的XML處理能力

          <#recurse> 和<#visit>指令(2.3版本)用于遞歸遍歷XML樹

          在模板中清楚和直覺的訪問XML對象模型



          posted @ 2012-07-20 11:46 kermart 閱讀(975) | 評論 (0)編輯 收藏

          2012年7月10日

          java 中的 各種變量、代碼塊執行時機

          前言:這屬于 java 的基礎知識,你可以不了解,也可以不拿它當一回事,代碼也一樣能敲的順暢;這是很久之前,我從 C++ 轉 java 剛入門那會的看法,那會我堅持自己的理念:
              重實踐,講運用,輕理論。當然,對同一樣事物,在不同階段也會有不一樣的看法,這理念在某個時段已經不適合我,早就被拋棄了。不扯淡了,直接進入主題。

          java 中的變量大致分為 成員變量 和 局部變量 兩大類。

          成員變量:
              在類體里面定義的變量稱為成員變量;
              如果該成員變量有 static 關鍵字修飾,則該成員變量稱為 靜態變量類變量
              如果該成員變量沒有 static 關鍵字修飾,則該成員變量被稱為 非靜態變量實例變量

          局部變量:
              形參、方法內定義的變量、代碼塊中定義的變量,都屬于局部變量。

          類變量 (靜態變量
              1. 可以向前引用
              2. 變量屬于類本身
              3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間
              4. 通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的
              5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值
              6. 將在類的初始化之前初始化

          實例變量(非靜態變量)
              1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
              2. 變量屬于類的實例對象
              3. 隨著類的實例被創建而分配內存空間

          非靜態代碼塊
              直接由 { } 包起來的代碼,稱為非靜態代碼塊

          靜態代碼塊
              直接由 static { } 包起來的代碼,稱為靜態代碼塊

          類變量(靜態變量)、實例變量(非靜態變量)、靜態代碼塊、非靜態代碼塊 的初始化時機
              由 static 關鍵字修飾的(如:類變量[靜態變量]、靜態代碼塊)將在類被初始化創建實例對象之前被初始化,而且是按順序從上到下依次被執行;
              沒有 static 關鍵字修飾的(如:實例變量[非靜態變量]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的
              代碼塊優先執行到,其也是按順序從上到下依次被執行。

          - 以上是本人在翻完 PDF 后的個人筆記和理解以及見解,不見得百分百對,以下附上本人測試示例代碼,會更有說服性

          示例代碼
           1
           2/**
           3 * -----------------------------------------
           4 * @文件: Statical.java
           5 * @作者: fancy
           6 * @郵箱: fancydeepin@yeah.net
           7 * @時間: 2012-7-9
           8 * @描述: TEST
           9 * -----------------------------------------
          10 */

          11public class Statical {
          12
          13 /**
          14     * 靜態代碼塊
          15     * 類變量(靜態變量)可以向前引用(即:先引用,再定義)
          16     */

          17    static {
          18        name = "fancydeepin"// name 的定義在使用之后
          19        System.out.println("--->  靜態代碼塊被執行   <---");
          20    }

          21 /**
          22     * 類變量(靜態變量)在類的初始化之前初始化,無論類的實例將被創建多少個
          23     * 類變量(靜態變量)都將只在初始化時候在棧內存上分配一次空間
          24     * 凡 static 修飾的,都將按位置被順序執行,所以,
          25     * name 的值最終輸出 fancy 而不是上面的 fancydeepin
          26     */

          27    public static String name = "fancy"//類變量(靜態變量)
          28    private String mail = "myEmail"//實例變量(非靜態變量),定義時指定初始值,會比在構造器賦予值更早執行
          29    
          30    public Statical() {
          31        mail = "fancydeepin@yeah.net";
          32        System.out.println("---> 構造器代碼塊被執行 <---");
          33    }

          34 /**
          35     * 非靜態代碼塊
          36     * 實際上,非靜態代碼塊在類初始化創建實例時,將會被提取到類的構造器中,
          37     * 但是,非靜態代碼塊會比構造器中的代碼塊優先被執行
          38     * 所以,mail 最終輸出的是類構造器中給定的值,也就是 fancydeepin@yeah.net
          39     * 而不是 1525336367@qq.com,更不是 myEmail
          40     */

          41    {
          42        mail = "1525336367@qq.com";
          43        System.out.println("---> 非靜態代碼塊被執行 <---");
          44    }

          45    
          46    // getting and setting 
          47


          測試類示例代碼

           1
           2      /**
           3         * 類變量(靜態變量)在類被初始化創建實例之前被初始化
           4         */

           5        System.out.println("-----------------> @1 <----------------");
           6        System.out.println("name --->> " + Statical.name); // @1
           7        System.out.println("-----------------> @1 <----------------");
           8       /**
           9         * 創建類的實例對象
          10         */

          11        System.out.println("-----------------> @6 <----------------");
          12        Statical statical = new Statical(); // @6
          13        System.out.println("-----------------> @6 <----------------");
          14        /**
          15         * 通過實例來訪問類變量,底層將轉化成通過類本身來訪問類變量
          16         */

          17        System.out.println("-----------------> @2 <----------------");
          18        System.out.println("name --->> " + statical.name); // @2
          19        System.out.println("-----------------> @2 <----------------");
          20       /**
          21         * 如果類變量的值被改變,再訪問類變量,將得到被改變后的值
          22         */

          23        Statical.name = "fancydeepin";
          24        
          25        System.out.println("-----------------> @3 <----------------");
          26        System.out.println("name --->> " + statical.name); // @3
          27        System.out.println("-----------------> @3 <----------------");
          28        
          29        System.out.println("-----------------> @4 <----------------");
          30        System.out.println("name --->> " + Statical.name); // @4
          31        System.out.println("-----------------> @4 <----------------");
          32       /**
          33         * 非靜態代碼塊 和 構造器 被執行的時機
          34         */

          35        System.out.println("-----------------> @5 <----------------");
          36        System.out.println("mail --->> " + statical.getMail()); // @5
          37        System.out.println("-----------------> @5 <----------------");
          38


          后臺輸出結果


          -----------------> @1 <----------------
          --->  靜態代碼塊被執行   <---
          name 
          --->> fancy
          -----------------> @1 <----------------

          -----------------> @6 <----------------
          ---> 非靜態代碼塊被執行 <---
          ---> 構造器代碼塊被執行 <---
          -----------------> @6 <----------------

          -----------------> @2 <----------------
          name 
          --->> fancy
          -----------------> @2 <----------------

          -----------------> @3 <----------------
          name 
          --->> fancydeepin
          -----------------> @3 <----------------

          -----------------> @4 <----------------
          name 
          --->> fancydeepin
          -----------------> @4 <----------------

          -----------------> @5 <----------------
          mail 
          --->> fancydeepin@yeah.net
          -----------------> @5 <----------------



          為了能更好的看出后臺的輸出是哪一行代碼執行的結果,我用了 @和數字來做了標記,希望大家不要看暈了哈 ^_^
          最后針對輸出結果簡單說一下:
          @1 說明,靜態(類變量、靜態代碼塊)屬于類本身,不依賴于類的實例
          @6 說明,在創建類的實例對象的時候,非靜態代碼塊比構造器代碼塊更早的執行
          @3 4 說明,當類變量的值改變后,再通過類或類的實例來訪問類變量,得到的將是被改變后的值
          @5 說明,非靜態(實例變量、非靜態代碼塊)的地位是相等的,它們將按順序被執行,但會比構造器中的代碼塊更早的執行


          posted @ 2012-07-10 13:00 kermart 閱讀(1368) | 評論 (0)編輯 收藏

          僅列出標題  

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大丰市| 民勤县| 泊头市| 灌南县| 库尔勒市| 塔城市| 青田县| 马关县| 分宜县| 高陵县| 普宁市| 焉耆| 万全县| 明水县| 封丘县| 巩义市| 文成县| 石家庄市| 盐池县| 东方市| 含山县| 左云县| 六枝特区| 邛崃市| 涟水县| 礼泉县| 靖宇县| 措美县| 文水县| 兰溪市| 云浮市| 罗甸县| 徐汇区| 惠东县| 历史| 缙云县| 扶沟县| 施甸县| 保定市| 宜兰县| 喀喇|