創建項目 ----> 導入需要的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(); } }); } }
方法二:

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","淞幸瀏覽器"); } }