java内嵌浏览器的几种方式

最近遇到一个特殊的项目需求,就是需要在一个屏幕上打开多个窗口大小不同的浏览器、并且显示不同的页面。因为是需要浏览器无边框的,在网上找了好多资料,发现前端好像很难实现。所以就打算采用java后台内嵌浏览器,然后实现无边框的效果。

以下几种就是笔者采用的几种内嵌浏览器方式:

1.Swing + JXBrowser

jxBrowser是收费的,我在网上找的破解版

  • jxbrowser-6.14.jar
  • jxbrowser-win32-6.14.jar

新建一个springboot项目,项目右键新建一个lib模板把上面两个jar包拷贝进去

 

java内嵌浏览器的几种方式_第1张图片

选中两个jar包鼠标右键添加到library

java内嵌浏览器的几种方式_第2张图片

 

创建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() {
            // 窗口关闭时间监听
            @Override
            public void windowClosing(WindowEvent e){
                System.out.println("窗口关闭...");
            }
        });
    }
}

 

运行main方法显示以下页面

java内嵌浏览器的几种方式_第3张图片

 

需要注意的是 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();
    }
}

运行项目:

java内嵌浏览器的几种方式_第4张图片

 

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内嵌浏览器的几种方式_第5张图片

 

以上三种就是java内嵌浏览器的实现方式,三种对带有视频的网页支持不是很友好,播放不出视频,不过第一种jxbrowser购买了许可 即可正常使用视频播放功能,他对前端的页面渲染都相对较稳定,其他两种对有些页面可能渲染不出来。笔者项目前端用的是vue,所以用的是第一种内嵌浏览器方式。项目源码已上传到github,项目中的jar包都在项目的lib目录里,欢迎朋友们下载。

源码地址:https://github.com/tanjiawei1199/javaBrowser

 

 

 

 

你可能感兴趣的:(java内嵌浏览器的几种方式)