最近遇到一个特殊的项目需求,就是需要在一个屏幕上打开多个窗口大小不同的浏览器、并且显示不同的页面。因为是需要浏览器无边框的,在网上找了好多资料,发现前端好像很难实现。所以就打算采用java后台内嵌浏览器,然后实现无边框的效果。
以下几种就是笔者采用的几种内嵌浏览器方式:
1.Swing + JXBrowser
jxBrowser是收费的,我在网上找的破解版
新建一个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() {
// 窗口关闭时间监听
@Override
public void windowClosing(WindowEvent e){
System.out.println("窗口关闭...");
}
});
}
}
运行main方法显示以下页面
需要注意的是 jxbrowser实例只能存在一个,当再次运行main方法是将会报以下错:
这是因为使用的破解版,如果需要更多的支持可以购买正版:https://jxbrowser.support.teamdev.com/support/home
2.使用DJNativeSwing,需要以下三个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包
代码:
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