千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
使用VC,VB或者C#的开发者们对于在程序里面嵌入一个网页来说,那真是小事一桩。但是在JAVA里面,却几乎是不可能实现的任务。JEditorPane虽然说可以打开网页,但是它那解析速度以及解析质量,对于今天日益复杂的网页内容来说,就像没有一样。今天我们就使用一个开源的组件(jdic)来实现在JAVA程序里面嵌入网页的效率,运行界面如下:



下面言归正转吧,我们来介绍一下这个开源的组件,它的名字叫JDIC(JDesktop Integration Components),网址为:https://jdic.dev.java.net/,它提供了一种访问桌面组件的API,其中JDK6.0就采纳了其中了一些,比如系统栏图标的SystemTray和SystemIcon,还有代表桌面的Desktop等等,可见这个API是挺不错的。由于网页浏览器的特殊性,标准的JDK并没有把它加入进来,但是我们一样可以下载它来使用这个功能。明显地,这个功能是用本地方法实现的,所以下载完以后,把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("转到");
            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>点我</a></html>");
//            web.removeWebBrowserListener(this);
        }
    }
}

它比一般的别的实现好的地方就是,它可以很完全地和JAVA代码进行交互,包括浏览器事件的监听,浏览器内容的获取,以及自己调用浏览器来执行一段javasript,这些都是很强大并且很实用的功能。
怎么样,这下满足了一下我们把网页嵌入到JAVA程序中的愿望了吧。




尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2007-10-03 08:55 千里冰封 阅读(13642) 评论(15)  编辑  收藏 所属分类: JAVA开源

FeedBack:
# re: JAVA网页浏览器
2007-10-03 10:16 | 翔南
这个组件真的很NICE!!
能不能再详细介绍点访问桌面组件的相关内容捏!!~~
嘿嘿 谢谢哈  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-03 10:27 | 千里冰封
以后我会再介绍一些很实用,但是JAVA没有实现的功能  回复  更多评论
  
# re: JAVA网页浏览器[未登录]
2007-10-03 10:49 | 咖啡
用过eclipse吧。在例子里面有用swt编的一个浏览器。  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-03 14:59 | Unmi
用过eclipse就知道swt中可以嵌入IE或NetScape内核浏览网页,可以把这部分组件他离出来用的  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-03 15:37 | 千里冰封
但是SWT的太过于庞大了,SWING才是GUI开发首用的  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-04 09:29 | Matthew Chen
@千里冰封
其实无论jdic,还是java6里采用的方式,抑或swt,本质都是jni的方式去解决这一问题,然后跨平台实现了。比起swt,swing才是真正的庞大,当然这也体现了它功能的强大以及速度的相对延迟,说道gui开发的首选,如果项目设计了和本地操作系统相关的,就好比这个浏览器,完全可以用swt了,毕竟它多少还是有跨平台支持的。  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-04 11:06 | BeanSoft
我在 RedHat 9 中文下试 SWT 的 Browser 控件失败, 各位有何良策啊? 好像要额外装一个 Mozilla 的调试包. 本来想做 Code Manager .SWT Linux 版本的, 这下完蛋了. 也许别的系统能用.

http://html.xamjwg.org/java-browser.jsp 这有个纯 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.

下载试了一下, 还行, 没深入. 纯 Java 的如果想定制就容易多了.  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-04 11:39 | 千里冰封
相对SWING来说,SWT的跨平台就说得有些牵强了些,并且如果用SWING写应用的话,程序发布的时候是不需要附带任何第三方JAR的,可是用SWT不但要带JAR还要带DLL一起发布,呵呵,最好还是用标准的SWING的实现,毕竟它是标准API的一部份,并且性能的提升也是有目共睹的。:)  回复  更多评论
  
# re: JAVA网页浏览器[未登录]
2007-10-04 19:07 | NeedJava
比较同意楼主千里冰封的观点,如果纯粹要速度的话,我只会用C/C++而不会用SWT的。

  回复  更多评论
  
# re: JAVA网页浏览器
2007-10-08 15:15 | origo
我觉得多一个dll是不是与跨平台相背离了  回复  更多评论
  
# re: JAVA网页浏览器
2008-01-14 16:35 | cooc
为什么我的JDIC包里没

import org.jdesktop.jdic.browser.IWebBrowser;

这个类呢

  回复  更多评论
  
# re: JAVA网页浏览器
2008-02-29 16:12 | gembin
Eclipse RCP 不错!  回复  更多评论
  
# re: JAVA网页浏览器
2008-05-15 21:42 |
@cooc
我的jdic怎么也没有org.jdesktop.jdic.browser.IWebBrowser呢  回复  更多评论
  
# re: JAVA网页浏览器
2008-08-02 10:39 | cozl
怎么https://jdic.dev.java.net/这个网页打不开啊,好像没有证书什么的  回复  更多评论
  
# re: JAVA网页浏览器

只有注册用户登录后才能发表评论。


网站导航: