Java 开发中 Swing 界面嵌入浏览器实现方法详解

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 摘要:Java中嵌入浏览器可通过多种技术实现:1) JCEF框架利用Chromium内核,适合复杂网页;2) JEditorPane组件支持简单HTML显示,但功能有限;3) DJNativeSwing-SWT可内嵌浏览器,需特定内核支持;4) JavaFX WebView结合Swing可完美支持现代网页技术。每种方案各有特点,开发者需根据项目需求选择合适方法,如JCEF适合高性能要求,JEditorPane适合简单展示。(149字)

在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中加载指定网址,默认加载百度页面。


Java 开发,Swing 界面,浏览器嵌入,实现方法,Java Swing, 浏览器组件,AWT Swing,Java 浏览器嵌入,界面开发,Java GUI,WebView 嵌入,Swing 集成,Java 界面设计,浏览器控件,Java 开发技术



代码获取方式
https://pan.quark.cn/s/14fcf913bae6


相关文章
|
4月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
4月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
353 18
|
4月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
252 4
|
5月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
189 11
|
4月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
344 5
|
5月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
5月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
5月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
227 0
|
6月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
333 3
|
6月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
335 2