在Java中使用Swing嵌入浏览器,可通过多种方式实现,以下是几种常见的技术方案及应用实例:
使用JCEF框架
- 技术方案:JCEF全称为Java Chromium Embedded Framework,它能将Chromium浏览器内核嵌入到Java应用程序中。开发者可在项目的build路径中添加JCEF库文件,通过Java代码调用其API来控制浏览器。首先创建一个新的
CefApp
实例,并设置缓存路径、日志级别等初始化选项,然后通过CefBrowser
类创建浏览器窗口,加载指定URL地址。 - 应用实例:创建一个Java项目,导入JCEF依赖库。在主类中初始化JCEF环境,设置用户代理字符串等参数。接着创建一个Swing窗口作为浏览器界面,将
CefBrowser
组件嵌入其中。例如:
// 创建Swing窗口
JFrame frame = new JFrame("嵌入浏览器示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
// 创建CefBrowser实例并加载网页
CefBrowser browser = // 此处为创建CefBrowser的具体代码,需根据JCEF规范设置相关参数
browser.loadURL("https://www.baidu.com");
// 将浏览器组件添加到Swing窗口
frame.add(browser.getUIComponent(), BorderLayout.CENTER);
frame.setVisible(true);
使用JEditorPane组件
- 技术方案:JEditorPane是Swing中的一个文本组件,默认支持纯文本、HTML文本等内容类型。当设置其内容类型为
text/html
时,可以显示HTML页面。通过注册HyperlinkListener
监听器,可处理超链接点击事件,实现页面跳转等功能。 - 应用实例:
JEditorPane jep = new JEditorPane();
// 设置显示内容类型为HTML
jep.setContentType("text/html");
// 注册超链接监听器
jep.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent event) {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
try {
jep.setPage(event.getURL());
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
// 加载初始网页
try {
jep.setPage("https://www.baidu.com");
} catch (IOException e) {
e.printStackTrace();
}
JScrollPane scrollPane = new JScrollPane(jep);
JFrame frame = new JFrame("JEditorPane浏览器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(800, 600);
frame.setVisible(true);
不过,JEditorPane对网页中CSS的显示处理以及JavaScript脚本执行的支持较弱,适合显示简单HTML页面。
使用DJNativeSwing-SWT组件
- 技术方案:DJNativeSwing-SWT可用于在Java GUI中内嵌浏览器。通过实例化相关的浏览器对象,并传入不同参数来控制使用的内核,如
JWebBrowser webBrowser = new JWebBrowser(JWebBrowser.useWebkitRuntime())
可使用WEBKIT内核,但使用WEBKIT内核时通常要求安装Safari浏览器。 - 应用实例:
import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import dj.nativeSwing.browser.MyBrowser;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
String url = "http://www.baidu.com";
String title = "hello swing";
openForm(url, title);
}
private static void openForm(String url, String title) {
UIUtils.setPreferredLookAndFeel();
NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame(title);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new MyBrowser(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();
}
}
使用JavaFX WebView结合Swing
- 技术方案:JavaFX中的WebView组件内置了WebKit内核,能很好地支持HTML5、CSS3和JavaScript。通过
JFXPanel
可以将JavaFX组件嵌入到Swing应用中。先创建JFXPanel
作为容器,再在Platform.runLater
中初始化WebView并设置场景,最后将其添加到Swing窗口中。 - 应用实例:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class SwingTestCombine {
static WebView webView = null;
private static void gotoURL(String url) {
Platform.runLater(new Runnable() {
@Override
public void run() {
webView.getEngine().load(url);
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Java Explorer");
frame.setLayout(new BorderLayout());
frame.setSize(1400, 900);
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.setLocation(100, 20);
JFXPanel jFXPanel = new JFXPanel();
frame.add(jFXPanel, "Center");
JPanel controlPanel = new JPanel();
frame.add(controlPanel, "North");
JTextField urlField = new JTextField();
JButton goButton = new JButton("GO");
urlField.setText("input");
controlPanel.setLayout(new BorderLayout());
urlField.setPreferredSize(new Dimension(frame.getWidth() - 100, 1));
controlPanel.add(urlField, BorderLayout.WEST);
controlPanel.add(goButton, BorderLayout.EAST);
goButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String urlString = urlField.getText();
gotoURL(urlString);
}
});
urlField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
urlField.setText("");
}
});
Platform.runLater(new Runnable() {
@Override
public void run() {
webView = new WebView();
jFXPanel.setScene(new Scene(webView));
webView.getEngine().load("https://www.baidu.com");
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (JOptionPane.showConfirmDialog(null, "关闭?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
System.exit(0);
}
}
});
frame.setVisible(true);
}
}
以上代码创建了一个带有地址栏和“GO”按钮的Swing窗口,点击按钮可在嵌入的WebView中加载指定网址,默认加载百度页面。
代码获取方式
https://pan.quark.cn/s/14fcf913bae6
关注我获取更多内容