千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          使用VC,VB或者C#的開發(fā)者們對(duì)于在程序里面嵌入一個(gè)網(wǎng)頁(yè)來(lái)說(shuō),那真是小事一樁。但是在JAVA里面,卻幾乎是不可能實(shí)現(xiàn)的任務(wù)。JEditorPane雖然說(shuō)可以打開網(wǎng)頁(yè),但是它那解析速度以及解析質(zhì)量,對(duì)于今天日益復(fù)雜的網(wǎng)頁(yè)內(nèi)容來(lái)說(shuō),就像沒(méi)有一樣。今天我們就使用一個(gè)開源的組件(jdic)來(lái)實(shí)現(xiàn)在JAVA程序里面嵌入網(wǎng)頁(yè)的效率,運(yùn)行界面如下:



          下面言歸正轉(zhuǎn)吧,我們來(lái)介紹一下這個(gè)開源的組件,它的名字叫JDIC(JDesktop Integration Components),網(wǎng)址為:https://jdic.dev.java.net/,它提供了一種訪問(wèn)桌面組件的API,其中JDK6.0就采納了其中了一些,比如系統(tǒng)欄圖標(biāo)的SystemTray和SystemIcon,還有代表桌面的Desktop等等,可見(jiàn)這個(gè)API是挺不錯(cuò)的。由于網(wǎng)頁(yè)瀏覽器的特殊性,標(biāo)準(zhǔn)的JDK并沒(méi)有把它加入進(jìn)來(lái),但是我們一樣可以下載它來(lái)使用這個(gè)功能。明顯地,這個(gè)功能是用本地方法實(shí)現(xiàn)的,所以下載完以后,把jdic.dll放到我們的path目錄中,比如system32文件夾下面,然后我們就可以使用它的功能從而增加我們的JAVA程序了。

          上面的例子代碼如下:
          /*
           * Test1.java
           *
           * Created on 2007-10-2, 17:29:30
           *
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package test2;

          import java.awt.BorderLayout;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JPanel;
          import javax.swing.JTextField;
          import org.jdesktop.jdic.browser.IWebBrowser;
          import org.jdesktop.jdic.browser.WebBrowser;
          import org.jdesktop.jdic.browser.WebBrowserEvent;
          import org.jdesktop.jdic.browser.WebBrowserListenerAdapter;

          /**
           *
           * 
          @author hadeslee
           
          */
          public class Test1 extends JPanel implements ActionListener {

              
          private JTextField input;
              
          private JButton go;
              
          private IWebBrowser web;

              
          public Test1() {
                  
          super(new BorderLayout());
                  initWindow();
              }

              
          private void initWindow() {
                  
          try {
                      web 
          = new WebBrowser();
                      web.addWebBrowserListener(
          new MyListener());
                      go 
          = new JButton("轉(zhuǎn)到");
                      input 
          = new JTextField();
                      JPanel up 
          = new JPanel(new BorderLayout());
                      up.add(input, BorderLayout.CENTER);
                      up.add(go, BorderLayout.EAST);
                      
          this.add(up, BorderLayout.NORTH);
                      
          this.add(web.asComponent(), BorderLayout.CENTER);
                      input.addActionListener(
          this);
                      go.addActionListener(
          this);
                  } 
          catch (Exception ex) {
                      Logger.getLogger(Test1.
          class.getName()).log(Level.SEVERE, null, ex);
                  }
                  JFrame jf 
          = new JFrame("JAVA瀏覽器");
                  jf.add(
          this, BorderLayout.CENTER);
                  jf.setSize(
          500300);
                  jf.setLocationRelativeTo(
          null);
                  jf.setVisible(
          true);
                  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              }

              
          public void actionPerformed(ActionEvent ae) {
                  doOpen();
              }

              
          private void doOpen() {
                  
          try {
                      String text 
          = input.getText();
                      
          if (text == null || text.equals("")) {
                          
          return;
                      }
                      
          if (!text.toLowerCase().startsWith("http://")) {
                          text 
          = "http://" + text;
                      }
                      web.setURL(
          new URL(text));
                  } 
          catch (MalformedURLException ex) {
                      Logger.getLogger(Test1.
          class.getName()).log(Level.SEVERE, null, ex);
                  }
              }

              
          public static void main(String[] args) {
                  
          new Test1();
              }

              
          private class MyListener extends WebBrowserListenerAdapter {

                  
          private MyListener() {
                  }

                  @Override
                  
          public void documentCompleted(WebBrowserEvent arg0) {
                      System.out.println(
          "文檔下載完。。。");
                      web.executeScript(
          "alert('文檔下載完畢!')");
          //            web.setContent("<html><H1>Hello world!!<H1>" +
          //                    "<a href=http://www.google.cn>點(diǎn)我</a></html>");
          //            web.removeWebBrowserListener(this);
                  }
              }
          }

          它比一般的別的實(shí)現(xiàn)好的地方就是,它可以很完全地和JAVA代碼進(jìn)行交互,包括瀏覽器事件的監(jiān)聽,瀏覽器內(nèi)容的獲取,以及自己調(diào)用瀏覽器來(lái)執(zhí)行一段javasript,這些都是很強(qiáng)大并且很實(shí)用的功能。
          怎么樣,這下滿足了一下我們把網(wǎng)頁(yè)嵌入到JAVA程序中的愿望了吧。




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-10-03 08:55 千里冰封 閱讀(13713) 評(píng)論(15)  編輯  收藏 所屬分類: JAVA開源

          FeedBack:
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-03 10:16 | 翔南
          這個(gè)組件真的很NICE!!
          能不能再詳細(xì)介紹點(diǎn)訪問(wèn)桌面組件的相關(guān)內(nèi)容捏!!~~
          嘿嘿 謝謝哈  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-03 10:27 | 千里冰封
          以后我會(huì)再介紹一些很實(shí)用,但是JAVA沒(méi)有實(shí)現(xiàn)的功能  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器[未登錄](méi)
          2007-10-03 10:49 | 咖啡
          用過(guò)eclipse吧。在例子里面有用swt編的一個(gè)瀏覽器。  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-03 14:59 | Unmi
          用過(guò)eclipse就知道swt中可以嵌入IE或NetScape內(nèi)核瀏覽網(wǎng)頁(yè),可以把這部分組件他離出來(lái)用的  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-03 15:37 | 千里冰封
          但是SWT的太過(guò)于龐大了,SWING才是GUI開發(fā)首用的  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-04 09:29 | Matthew Chen
          @千里冰封
          其實(shí)無(wú)論jdic,還是java6里采用的方式,抑或swt,本質(zhì)都是jni的方式去解決這一問(wèn)題,然后跨平臺(tái)實(shí)現(xiàn)了。比起swt,swing才是真正的龐大,當(dāng)然這也體現(xiàn)了它功能的強(qiáng)大以及速度的相對(duì)延遲,說(shuō)道gui開發(fā)的首選,如果項(xiàng)目設(shè)計(jì)了和本地操作系統(tǒng)相關(guān)的,就好比這個(gè)瀏覽器,完全可以用swt了,畢竟它多少還是有跨平臺(tái)支持的。  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-04 11:06 | BeanSoft
          我在 RedHat 9 中文下試 SWT 的 Browser 控件失敗, 各位有何良策啊? 好像要額外裝一個(gè) Mozilla 的調(diào)試包. 本來(lái)想做 Code Manager .SWT Linux 版本的, 這下完蛋了. 也許別的系統(tǒng)能用.

          http://html.xamjwg.org/java-browser.jsp 這有個(gè)純 Java 的瀏覽器, 厲害啊, 開源的.
          Lobo (previously known as Warrior) is an open source web browser that is written completely in Java. It is undergoing active development with the aim to fully support HTML 4, Javascript and CSS2.

          下載試了一下, 還行, 沒(méi)深入. 純 Java 的如果想定制就容易多了.  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-04 11:39 | 千里冰封
          相對(duì)SWING來(lái)說(shuō),SWT的跨平臺(tái)就說(shuō)得有些牽強(qiáng)了些,并且如果用SWING寫應(yīng)用的話,程序發(fā)布的時(shí)候是不需要附帶任何第三方JAR的,可是用SWT不但要帶JAR還要帶DLL一起發(fā)布,呵呵,最好還是用標(biāo)準(zhǔn)的SWING的實(shí)現(xiàn),畢竟它是標(biāo)準(zhǔn)API的一部份,并且性能的提升也是有目共睹的。:)  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器[未登錄](méi)
          2007-10-04 19:07 | NeedJava
          比較同意樓主千里冰封的觀點(diǎn),如果純粹要速度的話,我只會(huì)用C/C++而不會(huì)用SWT的。

            回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-08 15:15 | origo
          我覺(jué)得多一個(gè)dll是不是與跨平臺(tái)相背離了  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2008-01-14 16:35 | cooc
          為什么我的JDIC包里沒(méi)

          import org.jdesktop.jdic.browser.IWebBrowser;

          這個(gè)類呢

            回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2008-02-29 16:12 | gembin
          Eclipse RCP 不錯(cuò)!  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2008-05-15 21:42 |
          @cooc
          我的jdic怎么也沒(méi)有org.jdesktop.jdic.browser.IWebBrowser呢  回復(fù)  更多評(píng)論
            
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2008-08-02 10:39 | cozl
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          主站蜘蛛池模板: 子长县| 五台县| 祥云县| 黄石市| 乌恰县| 达日县| 丁青县| 松原市| 社会| 区。| 江孜县| 浏阳市| 诏安县| 米脂县| 册亨县| 井冈山市| 鹤岗市| 阳江市| 于田县| 兴国县| 宣汉县| 平顺县| 宁陵县| 叶城县| 轮台县| 南通市| 漳州市| 广水市| 哈密市| 曲麻莱县| 广宗县| 大名县| 军事| 共和县| 娱乐| 靖州| 桂平市| 池州市| 和硕县| 商水县| 康平县|