当前位置: 首页 > news >正文

Springboot 集成 Swing

背景

Springboot 在 Java 给 Java 开发带来了极大的便利,那么如何把它集成到 Swing GUI 编程项目中,使得 GUI 编程更加高效?本人简单做了一下尝试,完成一个 demo ,贴出来供大家参考

具体步骤

创建一个 spring boot 项目

这步就不需要多说了,大家参考 spring 官网的初始化工具,自行搞一个。

在 eclipse 中安装 Swing 设计工具

这步也相对比较简单,大家随便找个博客照抄就可以。

Spring 上下文工具类

这个有什么用呢?后面会讲,先上代码

package com.example.demo.context;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class SpringContext implements ApplicationContextAware {private static ApplicationContext context = null;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}public static ApplicationContext getContext() {return context;}
}

应用程序上下文工具类

同样,下文会看到怎么用,还是先上代码

package com.example.demo.context;import javax.swing.JFrame;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import com.example.demo.view.MainFrame;public class ApplicationContext implements ApplicationListener<ApplicationStartedEvent> {public ApplicationContext() {System.out.println("ApplicationContext is inited..");}private JFrame frame;@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {this.updateContent(MainFrame.getInstance());}public void updateContent(JFrame _frame) {if(this.frame != null) {this.frame.setVisible(false);}this.frame = _frame;this.frame.setVisible(true);}
}

写一个登录的 Frame

package com.example.demo.view;import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;import com.example.demo.context.ApplicationContext;
import com.example.demo.context.SpringContext;public class LoginFrame extends JFrame {private static final long serialVersionUID = 1L;private JPanel contentPane;private static LoginFrame instance;public static LoginFrame getInstance() {if(instance == null) {instance = new LoginFrame();}return instance;}/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {LoginFrame frame = new LoginFrame();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public LoginFrame() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 450, 300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);JButton btnNewButton = new JButton("New button");btnNewButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {SpringContext.getContext().getBean(ApplicationContext.class).updateContent(new MainFrame());}});contentPane.add(btnNewButton);}}

写一个主业务 Frame

package com.example.demo.view;import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;import com.example.demo.context.ApplicationContext;
import com.example.demo.context.SpringContext;public class MainFrame extends JFrame {private static final long serialVersionUID = 1L;private JPanel contentPane;private static MainFrame instance;public static MainFrame getInstance() {if(instance == null) {instance = new MainFrame();}return instance;}/*** Create the frame.*/protected MainFrame() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 450, 300);JMenuBar menuBar = new JMenuBar();setJMenuBar(menuBar);JMenu mnNewMenu = new JMenu("系统");menuBar.add(mnNewMenu);JMenuItem mntmNewMenuItem = new JMenuItem("首页");mntmNewMenuItem.addActionListener(menuClick);mnNewMenu.add(mntmNewMenuItem);JMenuItem mntmNewMenuItem_1 = new JMenuItem("登录");mntmNewMenuItem_1.addActionListener(menuClick);mnNewMenu.add(mntmNewMenuItem_1);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(new BorderLayout(0, 0));}private void clearMainPanel() {Component[] cps = contentPane.getComponents();if(cps.length<=0) {return;}for(int i=0;i<cps.length;i++) {contentPane.remove(i);}}public static void main(String ...args) {EventQueue.invokeLater(new Runnable() {public void run() {try {MainFrame frame = new MainFrame();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}private ActionListener menuClick = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e.getActionCommand());if("登录".equals(e.getActionCommand())) {SpringContext.getContext().getBean(ApplicationContext.class).updateContent(LoginFrame.getInstance());}}};
}

总结

  • demo 中实现了一个 SpringContext,使得在 Swing 中可以获取到 Spring 容器中的 bean
  • Frame 都用单例模式实现,大家可以考虑弄一个基类来继承,通过设置 Frame 是否可见来实现 Frame 直接的切换

后面找点时间做一个有用的客户端。欢迎大家交流。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【面试八股总结】GMP模型
  • 小程序开发设计-第一个小程序:创建小程序项目④
  • curl格式化json之jq工具?
  • Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)
  • 6--SpringBootWeb案例(详解)
  • springboot实战学习笔记(2)
  • vue项目中,属性表头默认为横向排列,却没有纵向排列的组件或相关属性,如何将其纵向排列?
  • vivado中选中bd文件后generate output product是什么用,create HDL wrapper是什么用
  • Java | Leetcode Java题解之第414题第三大的数
  • 检查和测绘室内防撞无人机技术详解
  • 828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~
  • Qt 模型视图(四):代理类QAbstractItemDelegate
  • 3D GS 测试自己的数据
  • 深入剖析:C++类对象的内存布局与优化
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 230. Kth Smallest Element in a BST
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gops —— Go 程序诊断分析工具
  • Mocha测试初探
  • python_bomb----数据类型总结
  • Spark学习笔记之相关记录
  • springboot_database项目介绍
  • Web设计流程优化:网页效果图设计新思路
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于组件的设计工作流与界面抽象
  • 简单数学运算程序(不定期更新)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 新手搭建网站的主要流程
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (2)nginx 安装、启停
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .cfg\.dat\.mak(持续补充)
  • .Family_物联网
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 使窗口永不获得焦点
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Transactional类内部访问失效原因详解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题