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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM