zoukankan      html  css  js  c++  java
  • Java实现内嵌浏览器

    创建项目 ---->   导入需要的jar ---->  代码实现

    需要的jar:

    https://pan.baidu.com/s/1MEZ1S0LnKSMGQm24QWgmCw

    代码:

    package browserTest;
    /**
     * Java内嵌浏览器
     * @author WangSong
     */
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.browser.Browser;
    import org.eclipse.swt.browser.CloseWindowListener;
    import org.eclipse.swt.browser.LocationAdapter;
    import org.eclipse.swt.browser.LocationEvent;
    import org.eclipse.swt.browser.OpenWindowListener;
    import org.eclipse.swt.browser.ProgressAdapter;
    import org.eclipse.swt.browser.ProgressEvent;
    import org.eclipse.swt.browser.StatusTextEvent;
    import org.eclipse.swt.browser.StatusTextListener;
    import org.eclipse.swt.browser.TitleEvent;
    import org.eclipse.swt.browser.TitleListener;
    import org.eclipse.swt.browser.WindowEvent;
    import org.eclipse.swt.events.KeyAdapter;
    import org.eclipse.swt.events.KeyEvent;
    import org.eclipse.swt.events.MouseAdapter;
    import org.eclipse.swt.events.MouseEvent;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.internal.mozilla.nsIDOMDocument;
    import org.eclipse.swt.internal.mozilla.nsIDOMWindow;
    import org.eclipse.swt.internal.mozilla.nsIWebBrowser;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Menu;
    import org.eclipse.swt.widgets.MenuItem;
    import org.eclipse.swt.widgets.ProgressBar;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.TabFolder;
    import org.eclipse.swt.widgets.TabItem;
    
    public class ImitateBrowser {
    
        private volatile String newUrl = null;// 最新输入的链接
        private volatile boolean loadCompleted = false;// 表示当前页面完全导入
        private volatile boolean openNewItem = false;// 表示新的页面在新窗口中打开
    
        /*
         * 浏览器的当前标签参数
         */
        private TabItem tabItem_now;// 当前标签项
        private Browser browser_now;// 当前功能浏览器
    
        /*
         * 浏览器设置参数
         */
        private String homePage = "www.baidu.com";// 浏览器的首页
    
        /*
         * 浏览器外形布置
         */
        private Button button_back;// 后退按钮
        private Button button_forward;// 向前按钮
        private Button button_go;// 前进按钮
        private Button button_stop;// 停止按钮
        private Combo combo_address;// 地址栏
        private Browser browser_default = null;// 浏览窗口
        private ProgressBar progressBar_status;// 网页打开进度表,即页面导入情况栏
        private Label label_status;// 最终网页打开过程显示
        private TabFolder tabFolder;// Browser的容器
        private Composite composite_tool;// 工具栏区域
        private Composite composite_browser;// 浏览窗口区域
        private Composite composite_status;// 状态栏区域
        protected Display display;//唯一视图线程
        protected Shell shell_default;//视图线程中运行的窗口
    
        /**
         * Launch the application
         * 主程序入口
         * @param args
         */
        public static void main(String[] args) {
            try {
                ImitateBrowser window = new ImitateBrowser();
                window.open();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Open the window
         */
        public void open() {
            display = Display.getDefault();//创建一个图形线程
            shell_default = new Shell(display);//创建一个图像界面窗口
            createContents();//创建一个窗口容器
            
            shell_default.open();//打开窗口
            shell_default.layout();//加载布局
            //如果窗口未关闭且没有事件执行,线程休眠
            while (!shell_default.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
        }
    
        /**
         * Create contents of the window
         */
        protected void createContents() {
            /** 设置窗口  **/
            shell_default.setSize(649, 448);//初始化大小
            shell_default.setText("浏览器");//标题
            
            /** 设置布局  **/
            GridLayout gl_shell = new GridLayout();
            gl_shell.marginWidth = 0;// 组件与容器边缘的水平距离
            gl_shell.marginHeight = 0;// 组件与容器边缘的垂直距离
            gl_shell.horizontalSpacing = 0;// 组件之间的水平距离
            gl_shell.verticalSpacing = 0;// 组件之间的垂直距离
            shell_default.setLayout(gl_shell);
    
            /** 创建浏览器界面 **/
            // createMenu();//没有实现
            createTool();//工具栏
            createBrowser();//集成浏览器
            createStatus();//状态
    
            /** 创建浏览器相关事件监听 **/
            runThread();
        }
    
        /*
         * 创建基本工具栏,不包括相关事件监听
         */
        private void createTool() {
            composite_tool = new Composite(shell_default, SWT.BORDER);
            // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
            GridData gd_composite = new GridData(SWT.FILL, SWT.CENTER, true, false);
            gd_composite.heightHint = 30;// 高度
            gd_composite.widthHint = 549;// 宽度
            composite_tool.setLayoutData(gd_composite);
            
            GridLayout fl_composite = new GridLayout();
            fl_composite.numColumns = 8;
            composite_tool.setLayout(fl_composite);
    
            //后退按钮
            button_back = new Button(composite_tool, SWT.NONE);
            button_back.setLayoutData(new GridData(30, SWT.DEFAULT));// 设置大小和格式
            button_back.setText("向后");
    
            //向前按钮
            button_forward = new Button(composite_tool, SWT.NONE);
            button_forward.setLayoutData(new GridData(30, SWT.DEFAULT));
            button_forward.setText("向前");
    
            //地址栏
            combo_address = new Combo(composite_tool, SWT.BORDER);
            final GridData gd_combo_3 = new GridData(SWT.FILL, SWT.LEFT, true,false);// 在窗口变化时,自动扩展水平方向的大小
            gd_combo_3.widthHint = 300;// 起始宽度
            gd_combo_3.minimumWidth = 50;// 设置最小宽度
            combo_address.setLayoutData(gd_combo_3);
    
            //跳转按钮
            button_go = new Button(composite_tool, SWT.NONE);
            button_go.setLayoutData(new GridData(30, SWT.DEFAULT));
            button_go.setText("跳转");
    
            //停止按钮
            button_stop = new Button(composite_tool, SWT.NONE);
            button_stop.setLayoutData(new GridData(30, SWT.DEFAULT));
            button_stop.setText("停止");
    
            final Label label = new Label(composite_tool, SWT.SEPARATOR | SWT.VERTICAL);
            label.setLayoutData(new GridData(2, 17));
    
        }
    
        /*
         * 创建浏览器,不包括相关事件监听
         */
        private void createBrowser() {
            composite_browser = new Composite(shell_default, SWT.NONE);
            final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true,true);// 充满窗口,且水平和垂直方向随窗口而变
            gd_composite.heightHint = 273;
            composite_browser.setLayoutData(gd_composite);
            GridLayout gl_composite = new GridLayout();
            gl_composite.marginHeight = 0;// 使组件上下方向容器
            gl_composite.marginWidth = 0;// 使组件左右方向占满容器
            composite_browser.setLayout(gl_composite);
    
            tabFolder = new TabFolder(composite_browser, SWT.NONE);
            final GridData gd_tabFolder = new GridData(SWT.FILL, SWT.FILL, true,true);
            gd_tabFolder.heightHint = 312;
            gd_tabFolder.widthHint = 585;
            tabFolder.setLayoutData(gd_tabFolder);
    
            /*
             * 为标签添加右键功能
             */
            tabFolder.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseUp(MouseEvent e) {
                    if (e.button == 3) {// 右键
                        Menu menu_itemRightMouse = new Menu(shell_default,SWT.POP_UP);
                        tabFolder.setMenu(menu_itemRightMouse);
                        //第一个标签选项:关闭当前
                        MenuItem menuItem_itemClose = new MenuItem(menu_itemRightMouse, SWT.NONE);
                        menuItem_itemClose.setText("关闭当前标签");
                        menuItem_itemClose
                                .addSelectionListener(new SelectionAdapter() {
                                    @Override
                                    public void widgetSelected(SelectionEvent e) {
                                        if (tabFolder.getItemCount() != 1) {// 不是只存在一个标签的情况下
                                            browser_now.dispose();
                                            tabItem_now.dispose();
                                            tabFolder.redraw();
                                        } else {// 只有一个标签
                                            browser_now.setUrl(":blank");
                                            browser_now.setText("");
                                        }
                                    }
                                });
                        //第二个标签选项:关闭所有
                        MenuItem menuItem_itemCloseAll = new MenuItem(menu_itemRightMouse, SWT.NONE);
                        menuItem_itemCloseAll.setText("关闭所有标签");
                        menuItem_itemCloseAll
                                .addSelectionListener(new SelectionAdapter() {
                                    @Override
                                    public void widgetSelected(SelectionEvent e) {
                                        shell_default.close();
                                    }
                                });
                    }
                }
            });
    
            //设置浏览器数据
            final TabItem tabItem_default = new TabItem(tabFolder, SWT.NONE);
            browser_default = new Browser(tabFolder, SWT.NONE);
            tabItem_default.setControl(browser_default);
            browser_default.setUrl(homePage);// 显示浏览器首页
    
            /*
             * 把初始化的标签置顶,选中
             */
            tabFolder.setSelection(tabItem_default);
    
        }
    
        /*
         * 创建浏览器底部状态栏,不包括相关事件监听
         */
        private void createStatus() {
            //窗口中新建一个展示的容器
            composite_status = new Composite(shell_default, SWT.NONE);
            final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true,false);// 参数true使状态栏可以自动水平伸缩
            gd_composite.heightHint = 20;
            gd_composite.widthHint = 367;
            composite_status.setLayoutData(gd_composite);
            GridLayout gl_composite = new GridLayout();
            gl_composite.numColumns = 2;
            gl_composite.marginBottom = 5;
            composite_status.setLayout(gl_composite);
    
            label_status = new Label(composite_status, SWT.NONE);
            GridData gd_status = new GridData(SWT.FILL, SWT.CENTER, true, false);
            gd_status.heightHint = 13;
            gd_status.widthHint = 525;
            label_status.setLayoutData(gd_status);
    
            progressBar_status = new ProgressBar(composite_status, SWT.BORDER | SWT.SMOOTH);
            progressBar_status.setLayoutData(new GridData(80, 12));
            progressBar_status.setVisible(false);// 打开过程初始不可见
    
        }
    
        /**
         * 监听事件
         */
        private void runThread() {
    
            /*
             * 浏览器新标签前进、后退按钮的默认可用性为不可用
             */
            button_back.setEnabled(false);
            button_forward.setEnabled(false);
    
            /*
             * 获取浏览器的当前标签和功能Browser
             */
            tabItem_now = tabFolder.getItem(tabFolder.getSelectionIndex());
            browser_now = (Browser) tabItem_now.getControl();
    
            /*
             * 选中事件发生时,修改当前浏览器标签
             */
            tabFolder.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    TabItem temp = (TabItem) e.item;
                    if (temp != tabItem_now) {// 防止重选一个标签,预防多次触发相同事件
                        tabItem_now = temp;
                        browser_now = (Browser) tabItem_now.getControl();
                        // System.out.println("当前标签被修改了");//调试语句
    
                        /*
                         * 在相应的标签中,前进、后退按钮可用性是不一样的
                         */
                        if (browser_now.isBackEnabled()) {// 后退按钮的可用性
                            button_back.setEnabled(true);
                        } else {
                            button_back.setEnabled(false);
                        }
                        if (browser_now.isForwardEnabled()) {// 前进按钮的可用性
                            button_forward.setEnabled(true);
                        } else {
                            button_forward.setEnabled(false);
                        }
    
                    }
                }
            });
    
            /*
             * 添加浏览器的后退、向前、前进、停止按钮事件监听
             */
            button_back.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent arg0) {
                    if (browser_now.isBackEnabled()) {// 本次可后退
                        browser_now.back();
                        button_forward.setEnabled(true);// 下次可前进,前进按钮可用
                        // System.out.println("可后退");//调试语句
                    }
                    if (!browser_now.isBackEnabled()) {// 下次不可后退,后退按钮不可用
                        button_back.setEnabled(false);
                    }
                }
            });
    
            button_forward.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent arg0) {
                    if (browser_now.isForwardEnabled()) {// 本次可前进
                        browser_now.forward();
                        button_back.setEnabled(true);// 后退按钮可用
                        // System.out.println("可向前");//调试语句
                    }
                    if (!browser_now.isForwardEnabled()) {// 下次不可前进,前进按钮不可用
                        button_forward.setEnabled(false);
                    }
                }
            });
    
            button_stop.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent arg0) {
                    browser_now.stop();
                }
            });
    
            combo_address.addKeyListener(new KeyAdapter() {// 手动输入地址栏后,按回车键转到相应网址
                        @Override
                        public void keyReleased(KeyEvent e) {
                            if (e.keyCode == SWT.CR) {// 回车键触发事件
                                browser_now.setUrl(combo_address.getText());
                            }
                        }
                    });
    
            /*
             * 1>在addOpenWindowListener()下的open()写入e.browser =
             * browser_new情况下,导入新的超级链接, 只有当点击页面上的链接,且链接不在新的页面打开时才会发生.
             * 2>在addOpenWindowListener()下的open()不写入e.browser =
             * browser_new情况下,导入新的超级链接, 只有当点击页面上的链接,且链接在新的页面打开时才会发生.
             * 除了以上两种外,当然还包括browser
             * .back()、browser.forward()、browser.go()、browser.setUrl()发生时触发,
             * 但changing()在不写入e.browser = browser_new情况下,不被browser.setUrl()触发
             */
            browser_now.addLocationListener(new LocationAdapter() {
                @Override
                public void changing(LocationEvent e) {// 表示超级链接地址改变了
                    if (openNewItem == false) {// 新的页面在同一标签中打开
                        button_back.setEnabled(true);// 后退按钮可用,此句是后退按钮可用判定的逻辑开始点
                    }
                    // System.out.println("location_changing");// 调试语句
                }
    
                @Override
                public void changed(LocationEvent e) {// 找到了页面链接地址
                    combo_address.setText(e.location);// 改变链接地址显示
                    /*
                     * 新的页面已经打开,browser的LocationListener已经监听完毕,openNewItem回复默认值
                     */
                    if (openNewItem == true) {
                        openNewItem = false;
                    }
                    // System.out.println("location_changed");// 调试语句
    
                }
    
            });
    
            /*
             * 新的超级链接页面的导入的百分比,在导入新的页面时发生,此时链接地址已知
             */
            browser_now.addProgressListener(new ProgressAdapter() {
                @Override
                public void changed(ProgressEvent e) {// 本事件不断发生于页面的导入过程中
                    progressBar_status.setMaximum(e.total);// e.total表示从最开始页面到最终页面的数值
                    progressBar_status.setSelection(e.current);
                    if (e.current != e.total) {// 页面还没完全导入
                        loadCompleted = false;
                        progressBar_status.setVisible(true);// 页面的导入情况栏可见
                    } else {
                        loadCompleted = true;
                        progressBar_status.setVisible(false);// 页面导入情况栏不可见
                    }
                    // System.out.println("progress_changed");//调试语句
    
                }
    
                @Override
                public void completed(ProgressEvent arg0) {// 发生在一次导入页面时,本监听器changed事件最后一次发生之前
                    // System.out.println("progress_completed");//调试语句
                }
            });
    
            /*
             * 获取页面内容过程,文字显示addProgressListener()过程,同时还能检测到已打开页面的存在的超级链接,就是用给功能来获取
             * 新的链接地址的
             */
            browser_now.addStatusTextListener(new StatusTextListener() {
                public void changed(StatusTextEvent e) {
                    if (loadCompleted == false) {
                        label_status.setText(e.text);
                    } else {
                        newUrl = e.text;// 页面导入完成,捕捉页面上可能打开的链接
                    }
                    // System.out.println("statusText_changed");//调试语句
                }
            });
    
            /*
             * 显示页面的提示语句,在新的页面导入时发生
             */
            browser_now.addTitleListener(new TitleListener() {
                public void changed(TitleEvent e) {
                    shell_default.setText(e.title);
                    if (e.title.length() > 3) {// 显示当前页面提示字符在标签上
                        tabItem_now.setText(e.title.substring(0, 3) + "..");
                    } else {
                        tabItem_now.setText(e.title);
                    }
                    tabItem_now.setToolTipText(e.title);// 标签显示提示符
                }
            });
    
            /*
             * 打开新的页面,当前打开页面新的链接需要在新的窗口页面打开时发生.addOpenWindowListener下open()中的一句
             * e.browser =
             * browser_new;关键部分.联系addOpenWindowListener、addVisibilityWindowListener
             * 和addDisposeListener的值传递枢纽
             */
            browser_now.addOpenWindowListener(new OpenWindowListener() {// 在当前页面中打开点击的链接页面
                        public void open(WindowEvent e) {
                            Browser browser_new = new Browser(tabFolder, SWT.NONE);//浏览器内核选择(WEBKIT/MOZILLA)
                            TabItem tabItem_new = new TabItem(tabFolder, SWT.NONE);
                            tabItem_new.setControl(browser_new);
                            tabFolder.setSelection(tabItem_new);// 新打开的页面标签置顶
                            tabFolder.redraw();// 刷新容器
                            browser_new.setUrl(newUrl);// 新标签中设置新的链接地址
                            openNewItem = true;// 新的页面在新的标签中打开
    
                            /*
                             * 关键部分,告知新的页面由browser_new打开,只要实现这句就不会弹出操作系统默认的浏览器了
                             */
                            e.browser = browser_new;
                            // System.out.println("OpenWindowListener_open");//调试语句
    
                            /*
                             * 为浏览器新的标签添加事件监听(异步)
                             */
                            display.syncExec(new Runnable() {
                                public void run() {
                                    runThread();
                                }
                            });
    
                        }
                    });
    
            /*
             * 浏览器关闭事件,关闭当前功能浏览器,不然的话浏览器主窗口关闭了,还有进程在运行
             */
            browser_now.addCloseWindowListener(new CloseWindowListener() {
                public void close(WindowEvent e) {
                    browser_now.dispose();
                }
            });
    
        }
    }
    View Code

    方法二:

    package browserTest;
    
    import java.awt.BorderLayout;
    
    import javax.swing.*;
    
    import org.eclipse.swt.internal.mozilla.nsIWebBrowser;
    
    import chrriis.common.UIUtils;
    import chrriis.dj.nativeswing.swtimpl.NativeInterface;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowserWindow;
    
    /**
     * swing实现简单的浏览器窗口
     * @author WangSong
     *
     */
    public class SimpleBrowser extends JPanel {
        //引入窗口、jweb
        private JPanel webBrowserPanel;
        private JWebBrowser webBrowser;
     
        //构造器传入参数
        public SimpleBrowser(String url) {
            super(new BorderLayout());
            webBrowserPanel = new JPanel(new BorderLayout());
            webBrowser = new JWebBrowser();
            webBrowser.navigate(url);//默认打开的网址
            webBrowser.setButtonBarVisible(true);//按钮组
            webBrowser.setMenuBarVisible(true);//菜单
            webBrowser.setBarsVisible(true);//组件可见
            webBrowser.setStatusBarVisible(true);//组件可用
            webBrowserPanel.add(webBrowser, BorderLayout.CENTER);//添加浏览器、居中显示
            add(webBrowserPanel, BorderLayout.CENTER);//Container中添加Panel、居中显示
            //执行Js代码
    //        webBrowser.executeJavascript("alert('浏览器打开了....')");
      
        }
     
     
        /**
         * 在swing里内嵌浏览器
         * @param url  要访问的url
         * @param title    窗体的标题
         */
        public  static void  openForm(String url,String title){
            UIUtils.setPreferredLookAndFeel();
            NativeInterface.open();
            //新的线程运行浏览器效果
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame(title);
                    //设置窗体关闭的时候不关闭应用程序
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.getContentPane().add(new SimpleBrowser(url), BorderLayout.CENTER);
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                    frame.setLocationByPlatform(true);
                    //让窗体可见
                    frame.setVisible(true);
                    //重置窗体大小
                    frame.setResizable(true);
                    // 设置窗体的宽度、高度
                    frame.setSize(1400, 700);
                    // 设置窗体居中显示
                    frame.setLocationRelativeTo(frame.getOwner());
                }
            });
            NativeInterface.runEventPump();
        }
     
        //主程序入口
        public static void main(String[] args) {
            openForm("http://www.baidu.com","淞幸浏览器");
        }
    }
    View Code
  • 相关阅读:
    读<<关于程序员的技能>> 惭愧,希望有人能进来解惑! 人工智能
    我也来说说多核 人工智能
    有感于.net社区挺唐骏的作假的文章,诚实是美德,你们可以做假发财成功,但请不要批评,嘲笑他人诚实贫穷 人工智能
    几个程序员也难已回答的问题 人工智能
    Flash已死,有事烧纸! 人工智能
    关于Windows7的用户体验,我们是属于跟不上时代的古董,还是那个敢说出皇帝新衣的男孩? 人工智能
    企鹅帝国的疯狂反扑! 人工智能
    微软IE9预览版全面(100%)支持HTML5和CSS3,到学习使用Html5的时候了 人工智能
    Flash已死终成现实,Adobe亲手埋葬Flash,并公开支持Html5 人工智能
    4个月,你就是企业需要的程序员人才,听蒋涛(CSDN)在线说“黑马” 人工智能
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/11343850.html
Copyright © 2011-2022 走看看