Springboot 集成 Swing

发布于:2024-09-17 ⋅ 阅读:(123) ⋅ 点赞:(0)

背景

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;
	@Override
	public 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;
	@Override
	public 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() {
		@Override
		public 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 直接的切换

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


网站公告

今日签到

点亮在社区的每一天
去签到