Java 开发中 Swing 如何嵌入浏览器实现方案

在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


关注我获取更多内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值