Java-关于Swing窗体如何实现在同一个窗体实现不同面板的切换的解决

今天聊聊关于Swing窗体如何实现在同一个窗体实现不同面板的切换的解决方案,这个问题也是一直困扰了我很久,都快半个多月了,因为我们数据库课设(是做一个 ***系统)要用到Java-Swing创建窗体,而我想实现这样一个功能:就是一个窗体上有几个不同的按钮,和一个主面板,通过点击按钮,切换不同的面板,即显示不同的内容。

这个之前也在百度上找了很多很多的实现方案,但感觉实现方式都不是很理想,这里我做了一个改进的解决方案。实现步骤大体如下:

  1. 创建一个主窗体JFrame
  2. 在主窗体上添加一个主显示JPanel
  3. 在主窗体上添加切换按钮或者在菜单栏上添加按钮也行
  4. 写要替换显示的JPanel类,直接继承JPanel,这个JPanel类对应的面板大小建议设置和步骤2主显示JPanel的宽和高一致
  5. 在主窗体类中添加一个CardLayout cardLayout=new CardLayout()成员
  6. 给主显示JPanel设置步骤5的布局方式
  7. 创建要替换显示JPanel类的对象,将其添加到主显示JPanel中
  8. 给对应的按钮添加事件,调用cardLayout.show()方法要选择点击按钮后要切换显示的面板

下面是我做的一个小demo,简单演示一下: 

主窗体类:

package gui2;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Jrame1 extends JFrame {

	private JPanel contentPane;
	CardLayout cardLayout=new CardLayout();

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Jrame1 frame = new Jrame1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Jrame1() {
		setTitle("demo—同一个窗口不同面板切换");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBounds(60, 10, 300, 200);
		contentPane.add(panel);
//		给主要显示面板添加布局方式
		panel.setLayout(cardLayout);
//		创建相应面板类的对象
		P1 p1=new P1();
//		将面板添加到住面板中,注意:add()方法里有两个参数,第一个是要添加的对象,第二个给这个对象所放置的卡片
//		起个名字,后面调用显示的时候要用到这个名字
		panel.add(p1,"p1");
		P2 p2=new P2();
		panel.add(p2,"p2");
		
		
		JButton btnNewButton = new JButton("页面1");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
//				这里是点击按钮切换不同的页面
//				cardLayout.show(参数 1,参数2)方法里面也有两个参数,
//				参数1是表示指明你要在哪个容器上显示,
//				参数2是指明要显示哪个卡片,即你要给出对应卡片的名字
				cardLayout.show(panel, "p1");
			}
		});
		btnNewButton.setBounds(70, 220, 97, 23);
		contentPane.add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("页面2");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
//				同上
				cardLayout.show(panel, "p2");
			}
		});
		btnNewButton_1.setBounds(251, 220, 97, 23);
		contentPane.add(btnNewButton_1);
	}
}

测试面板1: 

package gui2;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;

public class P1 extends JPanel {
	private JTextField jt1;

	/**
	 * Create the panel.
	 */
	public P1() {
		setLayout(null);
		
		JLabel lblNewLabel = new JLabel("我是页面1  (*^-^)");
		lblNewLabel.setFont(new Font("宋体", Font.BOLD, 22));
		lblNewLabel.setBounds(34, 26, 233, 69);
		add(lblNewLabel);
		
		jt1 = new JTextField();
		jt1.setBounds(34, 105, 100, 21);
		add(jt1);
		jt1.setColumns(10);
		
		JButton btnNewButton = new JButton("提交");
		
		btnNewButton.setBounds(146, 104, 97, 23);
		add(btnNewButton);

	}
}

测试面板2:

package gui2;

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JTextField;

public class P2 extends JPanel {

	/**
	 * Create the panel.
	 */
	public P2() {
		setLayout(null);
		JLabel lblNewLabel = new JLabel("我是页面2  (*^▽^*)");
		lblNewLabel.setFont(new Font("Dialog", Font.BOLD, 24));
		lblNewLabel.setBounds(23, 10, 245, 94);
		add(lblNewLabel);
		
		JTextField jt2 = new JTextField();
		jt2.setBounds(42, 114, 206, 21);
		add(jt2);
		jt2.setColumns(10);
		
		JButton btnNewButton = new JButton("确定");
		btnNewButton.setBounds(42, 145, 97, 23);
		add(btnNewButton);
		
	}
}

相关效果图:点击下面按钮显示对应的面板内容

 

 

这个实现方式自我感觉还是比较简洁方便的,有兴趣的可以尝试一下,哪有不对,欢迎各路大神指正!!!(*^▽^*)

 

  • 41
    点赞
  • 250
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值