当前位置 博文首页 > 缘分锝天空的博客:Java-关于Swing窗体如何实现在同一个窗体实现

    缘分锝天空的博客:Java-关于Swing窗体如何实现在同一个窗体实现

    作者:[db:作者] 时间:2021-08-03 20:56

    今天聊聊关于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);
    		
    	}
    }
    

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

    ?

    ?

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

    ?

    cs