java内嵌浏览器的几种方式
最近遇到一個特殊的項目需求,就是需要在一個屏幕上打開多個窗口大小不同的瀏覽器、并且顯示不同的頁面。因為是需要瀏覽器無邊框的,在網上找了好多資料,發現前端好像很難實現。所以就打算采用java后臺內嵌瀏覽器,然后實現無邊框的效果。
以下幾種就是筆者采用的幾種內嵌瀏覽器方式:
1.Swing + JXBrowser
jxBrowser是收費的,我在網上找的破解版
- jxbrowser-6.14.jar
- jxbrowser-win32-6.14.jar
新建一個springboot項目,項目右鍵新建一個lib模板把上面兩個jar包拷貝進去
?
選中兩個jar包鼠標右鍵添加到library
?
創建main方法
import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.swing.BrowserView;import javax.swing.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;/****** @author tjw* @versuion 1.0* @date 2018/12/13 17:16*/ public class Test {public static void main(String[] args) {String url = "http://www.baidu.com";JFrame frame = new JFrame();// 谷歌內核瀏覽器Browser browser = new Browser();BrowserView view = new BrowserView(browser);//禁用close功能 // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//隱藏任務欄圖標 // frame.setType(JFrame.Type.UTILITY); // //不顯示標題欄,最大化,最小化,退出按鈕frame.setUndecorated(true);//尺寸 // frame.setSize(500, 500);//坐標frame.setLocation(0, 0);frame.add(view);//全屏顯示frame.setExtendedState(JFrame.MAXIMIZED_BOTH);// 是否顯示frame.setVisible(true);//是否在屏幕最上層顯示frame.setAlwaysOnTop(true);//加載地址browser.loadURL(url);// System.out.println(frame.getX()); // System.out.println(frame.getY()); // list.add(frame);frame.addWindowListener(new WindowAdapter() {// 窗口關閉時間監聽@Overridepublic void windowClosing(WindowEvent e){System.out.println("窗口關閉...");}});} }?
運行main方法顯示以下頁面
?
需要注意的是 jxbrowser實例只能存在一個,當再次運行main方法是將會報以下錯:
?
這是因為使用的破解版,如果需要更多的支持可以購買正版:https://jxbrowser.support.teamdev.com/support/home
?
2.使用DJNativeSwing,需要以下三個jar包
- djnativeswing.jar
- djnativeswing-swt.jar
- org.eclipse.swt.win32.win32.x86_64-4.3.jar
代碼:
import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener;import javax.swing.*;import chrriis.common.UIUtils; import chrriis.dj.nativeswing.swtimpl.NativeInterface; import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser; import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter; import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;public class Browser2 extends JPanel {public Browser2() {super(new BorderLayout());JPanel webBrowserPanel = new JPanel(new BorderLayout());webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component"));final JWebBrowser webBrowser = new JWebBrowser();webBrowser.navigate("http://www.baidu.com");webBrowserPanel.add(webBrowser, BorderLayout.CENTER);add(webBrowserPanel, BorderLayout.CENTER);// Create an additional bar allowing to show/hide the menu bar of the web browser.JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));JCheckBox menuBarCheckBox = new JCheckBox("Menu Bar", webBrowser.isMenuBarVisible());menuBarCheckBox.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent e) {webBrowser.setMenuBarVisible(e.getStateChange() == ItemEvent.SELECTED);}});buttonPanel.add(menuBarCheckBox);add(buttonPanel, BorderLayout.SOUTH);}/* Standard main method to try that test as a standalone application. */public static void main(String[] args) {UIUtils.setPreferredLookAndFeel();NativeInterface.open();SwingUtilities.invokeLater(new Runnable() {public void run() {JFrame frame = new JFrame("DJ Native Swing Test");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(new Browser2(), BorderLayout.CENTER);//不顯示標題欄,最大化,最小化,退出按鈕frame.setUndecorated(true);frame.setSize(800, 600);frame.setLocationByPlatform(true);frame.setVisible(true);}});NativeInterface.runEventPump();} }運行項目:
?
3.使用SWT (org.eclipse.swt.SWT相關依賴)需要以下jar包
- org.eclipse.swt.win32.win32.x86_64-4.3.jar
代碼:
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.widgets.*;/****** @author tjw* @versuion 1.0* @date 2018/12/13 17:59*/ public class SWTtest {public static void main(String args[]){Display display=new Display();Shell shell=new Shell(display);shell.setText("SWT Browser Test");shell.setSize(800,600);final Text text=new Text(shell,SWT.BORDER);text.setBounds(110,5,560,25);Button button=new Button(shell,SWT.BORDER);button.setBounds(680,5,100,25);button.setText("go");Label label=new Label(shell,SWT.LEFT);label.setText("輸入網址 :");label.setBounds(5, 5, 100, 25);final Browser browser=new Browser(shell,SWT.FILL);browser.setBounds(5,30,780,560);button.addListener(SWT.Selection, new Listener(){public void handleEvent(Event event){String input=text.getText().trim();if(input.length()==0)return;if(!input.startsWith("http://")){input="http://"+input;text.setText(input);}browser.setUrl(input);}});shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch())display.sleep();}display.dispose();} }?
?
?
以上三種就是java內嵌瀏覽器的實現方式,三種對帶有視頻的網頁支持不是很友好,播放不出視頻,不過第一種jxbrowser購買了許可 即可正常使用視頻播放功能,他對前端的頁面渲染都相對較穩定,其他兩種對有些頁面可能渲染不出來。筆者項目前端用的是vue,所以用的是第一種內嵌瀏覽器方式。項目源碼已上傳到github,項目中的jar包都在項目的lib目錄里,歡迎朋友們下載。
源碼地址:https://github.com/tanjiawei1199/javaBrowser
?
?
?
?
總結
以上是生活随笔為你收集整理的java内嵌浏览器的几种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2013崩溃,无法打开项目的解决方案
- 下一篇: 【JavaScript】封装对象与强制类