Dev Zone
          偏執狂才能生存,人生/事業的路上需要再堅持一下
          但是又怎么說得清堅持的結果,道得盡堅持的含義

            下午,試用了SkinLF(http://www.l2fprod.com),感覺非常好,程序的外觀得到了很大的改善,還可以根據自己的需要隨意調整得到自己想要的外觀,但是要將SkinLF應用到Web Start中還有點問題。這是因為,web start使用到的資源必須包裝成jar文件,以的形式定義到jnlp資源文件中,而SkinLF的外觀配置文件是zip形式的。也許有人會說,把zip轉化成jar文件就可以了。是的,想象中這應當是可以的,可是實際情況不是如此,你會發現使用ClassLoader.getResourceStream("themepack.jar")的時候返回了Null,SkinLookAndFeel.loadLookAndFeel()會異常Stream closed.

            調試之后發現,即使是在客戶端,在Eclipse中運行的時候,如果不把themepack.jar定義到ClassPath中,也是無法加載的。

            我想這是一個普遍的問題,根據我的理解,如果其他資源,比如圖片、xml文件、屬性文件等等能夠被加載,themepack.jar也應該被加載。事實上應該是這樣,但是關鍵在于SkinLF需要采用ZipInputStream解析zip(jar)文件,這時情況就不一樣了。具體的原因目前沒有搞清楚。

            在網上找了半天,終于發現一個Open Source的組件:Rachel,使用它很輕易就可以解決上面提到的問題。

            Rachelhttp://rachel.sourceforge.net)是一個為解決Web start裝載資源困難而開發的組件。它提供了兩種方法解決資源裝載問題。

               方法一,使用class://URL Handler。
                這個方法采用新的URL協議:class://從jar文件中獲取資源。

               Step 1,注冊新的URL Handler,以支持class://協議(protocal)。
               例子:java.net.URL.setURLStreamHandlerFactory( new RachelUrlFactory() );

               Step 2,采用class://協議構造URL,從jar文件中讀取資源。
            語法:class:///
            例子:

          class://test.LookAndFeelTest/themepack.zip
          class://com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip


            注意:這里,是Rachel用來定義資源文件所在的jar的,后面的相對于jar中的根目錄而言。上述例子中的jar的結構如下:

                test.jar:

                test
          /LookAndFeelTest.class
                com
          /l2fprod/gui/plaf/skin/SkinLookAndFeel.class
                themepack.zip
                images
          /example.png
                html
          /index.htm

            Step 3,采用java.net.URL獲取資源。
                例子:

              URL url = new URL("class://test.LookAndFeelTest/themepack.zip");
              URL url 
          = new URL("class://test.LookAndFeelTest/html/index.html");
              URL url 
          = new URL("class://test.LookAndFeelTest/images/example.png");

              URL url 
          = new URL("class://com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip");
              SkinLookAndFeel.setSkin( SkinLookAndFeel.loadThemePack(url) );

            方法二,在程序中嵌入多線程的,小型的http server。

            Step 1,把你的資源放到jar中。

            Step 2,在每一個jar中增加一個anchor class,幫組server定位資源所在的jar文件,這點類似于方法一class:///的的
            例子:

             public class CrossRefAnchor
             {
               
          public CrossRefAnchor() {}
             }

            CrossRefAnchor沒有任何的實際意義,只是為了幫組定義資源所在的jar。

            Step 3,為每一個包含資源的jar用ClassResourceLoader注冊到WebResourceManager。
            例子:

             WebResourceManager roots = WebResourceManager.getInstance();
             roots.addResourceLoader( 
          new ClassResourceLoader( CrossRefAnchor.class ) );
             roots.addResourceLoader( 
          new ClassResourceLoader( JavaDocAnchor.class ) );

            Step 4,啟動Server。
            例子:

             try
             {
               WebServer http 
          = new WebServer( 7272, roots );
               http.start();
             }
             
          catch( IOException e )
             {
               e.printStackTrace();
             }

            Step 5,采用URL從server獲取資源。
            例子:

             URL crossRefUrl = new URL( "http://localhost:7272/crossref/index.html" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/themepack.zip" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/html/index.html" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/images/example.png" );
          posted on 2005-05-17 22:11 dev 閱讀(1109) 評論(4)  編輯  收藏
          Comments
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            Dennis
            Posted @ 2005-05-18 12:05
            有更簡單的方法

            不是把 zip 取為 jar, 而是把 zip 放到 jar 內

            把 themepack.zip 再在外打包成一個只有一個檔案的 jar
            (放在主要程式的 jar 內也可, 但獨立放置更方便更新)

            例如
            themepack.jar
            \resource\themepack.zip

            themepack.jar
            \themepack.zip

            把 jar 放入 classpath (加到 webstart 的 jnlp 也可以)

            再使用 ClassLoader.getResourceStream("themepack.jar")
            或 ClassLoader.getResourceStream("/resource/themepack.jar")
            (跟據 themepack.jar 的內部路徑而定)

              回復  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            jdev
            Posted @ 2005-05-18 13:24
            不行的,會異常,你可以試一下。  回復  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            Dennis
            Posted @ 2005-05-18 16:06
            會嗎!?

            我只是把 zip 檔以一般 resource (e.g. *.properties, *.png) 的方式來做吧~?
            只是檔案會比較大吧!?

            (上面打錯了 path, jar 內的是 zip 才對)  回復  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            jdev
            Posted @ 2005-05-18 18:38
            我做過測試,不行。特殊就特殊在是zip格式,SkinLF需要讀取zip中的內容,也就是說需要采用ZipInputStream讀取zip文件,讀取的時候會異常,也許這是sun的一個bug。  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 衡阳市| 巴林右旗| 阳信县| 北京市| 巨鹿县| 仁布县| 荥阳市| 遂平县| 宣汉县| 大关县| 丹寨县| 从江县| 宜川县| 绿春县| 荔浦县| 云龙县| 沙坪坝区| 崇阳县| 卢氏县| 辽宁省| 成安县| 东城区| 孝感市| 辽阳市| 马关县| 建德市| 长宁县| 鄂尔多斯市| 台州市| 同仁县| 宜黄县| 湘潭市| 阿瓦提县| 龙口市| 博爱县| 喜德县| 岑巩县| 拉萨市| 夹江县| 盐源县| 衡东县|