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



          下面言歸正轉(zhuǎn)吧,我們來(lái)介紹一下這個(gè)開(kāi)源的組件,它的名字叫JDIC(JDesktop Integration Components),網(wǎng)址為:https://jdic.dev.java.net/,它提供了一種訪(fǎng)問(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)聽(tīng),瀏覽器內(nèi)容的獲取,以及自己調(diào)用瀏覽器來(lái)執(zhí)行一段javasript,這些都是很強(qiáng)大并且很實(shí)用的功能。
          怎么樣,這下滿(mǎn)足了一下我們把網(wǎng)頁(yè)嵌入到JAVA程序中的愿望了吧。




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

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

          FeedBack:
          # re: JAVA網(wǎng)頁(yè)瀏覽器
          2007-10-03 10:16 | 翔南
          這個(gè)組件真的很NICE!!
          能不能再詳細(xì)介紹點(diǎn)訪(fǎng)問(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開(kāi)發(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開(kāi)發(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 的瀏覽器, 厲害啊, 開(kāi)源的.
          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寫(xiě)應(yīng)用的話(huà),程序發(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à),我只會(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è)類(lèi)呢

            回復(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è)瀏覽器
          主站蜘蛛池模板: 葫芦岛市| 西华县| 仪陇县| 府谷县| 确山县| 九龙城区| 登封市| 衢州市| 旌德县| 繁峙县| 辉南县| 元朗区| 新野县| 保山市| 德安县| 静乐县| 长岛县| 焦作市| 宜州市| 灵山县| 八宿县| 拉孜县| 嘉峪关市| 临夏县| 大方县| 白玉县| 监利县| 文成县| 鄂托克旗| 东丽区| 视频| 桑日县| 龙口市| 黄大仙区| 江门市| 穆棱市| 尚义县| 贞丰县| 宁河县| 枞阳县| 广河县|