网站首页 > 技术文章 正文
Java 桌面程序中使用 Vue 开发界面,可以采用 "Java 后端 + Vue 前端" 的混合架构,通过内嵌浏览器组件来运行 Vue 页面。这种方案结合了 Java 的桌面应用能力和 Vue 的现代前端开发体验。
以下是实现方案和关键代码:
技术选型
- Java 端:使用 JavaFX 的 WebView 组件作为内嵌浏览器
- Vue 端:常规 Vue 项目,通过 HTTP 或本地文件与 Java 通信
- 通信方式:JavaScript 与 Java 的桥接机制
实现步骤
1. Java 主程序(内嵌浏览器)
Java桌面程序内嵌浏览器
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
// 创建WebView组件
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
// 暴露Java对象给JavaScript调用
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaBridge", new JavaBridge());
// 加载Vue构建后的index.html文件
// 注意:实际路径需要根据你的项目结构调整
String url = getClass().getResource("/web/dist/index.html").toExternalForm();
webEngine.load(url);
// 设置窗口
Scene scene = new Scene(webView, 1024, 768);
primaryStage.setTitle("Java + Vue 桌面应用");
primaryStage.setScene(scene);
primaryStage.show();
}
// Java与JavaScript通信的桥接类
public class JavaBridge {
// 示例方法:接收来自Vue的消息
public void receiveMessageFromVue(String message) {
System.out.println("收到Vue的消息: " + message);
// 可以在这里处理业务逻辑,然后返回结果给Vue
// 调用JavaScript的方法
WebEngine webEngine = ((WebView) ((Scene) ((Stage)
((javafx.scene.Parent) webView.getParent()).getScene().getWindow()).getScene()).getRoot()).getEngine();
webEngine.executeScript("receiveMessageFromJava('Java已收到消息: " + message + "')");
}
// 其他业务方法...
public String getSystemInfo() {
return "操作系统: " + System.getProperty("os.name") +
", Java版本: " + System.getProperty("java.version");
}
}
public static void main(String[] args) {
launch(args);
}
}
2. Vue 前端示例(与 Java 通信)
项目构建流程
- Vue 项目构建:创建常规 Vue 项目:vue create my-vue-ui开发完成后执行构建:npm run build将生成的 dist 目录复制到 Java 项目的资源目录(如 src/main/resources/web)
- Java 项目配置:添加 JavaFX 依赖添加 JavaScript 桥接所需的库(如 jfxrt.jar)确保 Vue 构建文件被正确打包到最终的 JAR 中
- 通信原理:Java 通过JSObject暴露对象给 JavaScriptJavaScript 通过window.javaBridge调用 Java 方法Java 通过webEngine.executeScript()调用 JavaScript 方法
替代方案
如果不想使用 JavaFX,还可以考虑:
- Electron + Java:使用 Electron 运行 Vue,通过进程间通信调用 Java 后端
- SWT + Browser:使用 Eclipse SWT 的 Browser 组件替代 JavaFX WebView
- JxBrowser:商业级的 Java 浏览器组件,功能更强大但需要授权
这种混合开发模式可以让你充分利用 Vue 的前端开发效率和 Java 的后端处理能力,同时保持桌面应用的特性。
猜你喜欢
- 2025-10-19 22《Vue 入门教程》VueRouter 路由嵌套
- 2025-10-19 JavaScript:字符串的相关方法_javascript字符串常用方法
- 2025-10-19 Vue3开发极简入门(2):TypeScript定义对象类型
- 2025-10-19 Vue2 和 Vue3 的区别差异_vue2和vue3学哪个
- 2025-10-19 前端小白 2 周 Vue3+TS+NaiveUI 学习计划大纲
- 2025-10-19 Vue3问题:如何使用WangEditor富文本?能自定义才是真的会用!
- 2025-10-19 Vue Bits - 免费开源、优雅高效的 Vue 3 动效组件库,React Bits 移植版
- 2025-10-19 实战篇 vue3 中的 emit 详细解答_vue中的$emit
- 2025-10-19 Vue3 爆改 Axios !用上了 专属请求库!
- 2025-10-19 Vue 2迁移Vue 3:从响应式到性能优化
- 最近发表
-
- 用Cursor开启JAVA+AI生涯_javascirpt怎么开启
- 大数据调度服务监控平台_大数据调度是什么意思
- SpringBoot、MyBatis、Vue搭建一个Java企业应用开源框架源码分享
- 大数据技术之Flume_大数据volume的含义
- Jenkins运维之路(Slave容器节点)_jenkins slave工作原理
- 程序员自救指南:IDEA 卡成狗?我的 9G 堆内存调参表让你起飞 附避坑
- JMeter:一个简单的测试计划怎么做?
- Windows 命令行终端 PowerShell 美化计划
- JDK25即将发布!新特性概览_jdk52.0
- JDK 25 新特性极简总结(2025 年 9 月 16 日发布,LTS 长期支持)
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)