用单例模式实现主JFrame不变,只有JPanel面板切换

Posted 小Cai先森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用单例模式实现主JFrame不变,只有JPanel面板切换相关的知识,希望对你有一定的参考价值。

1、首先介绍一下什么是单例模式:

  java单例模式是一种常见的设计模式,那么我们先看看懒汉模式:

public class Singleton_ {
    //设为私有方法,防止被外部类引用或实例
    private Singleton_(){
        System.out.println("懒汉单例模式");
    }
    private static Singleton_ single = null;
    //并对外只暴露getInstance()方法,这是获取唯一实例方法。
    public static Singleton_ getInstance(){
        if(single==null)
            single = new Singleton_();
        return single;
    }
}

  这是没有考虑线程安全问题的,因为在线程并发的情况下,容易有多个实例,所以这是个线程不安全的模式。还有像饿汉模式这样的:

//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
    private Singleton1() {}
    private static final Singleton1 single = new Singleton1();
    //对外只暴露getInstance()方法,这是获取唯一实例方法。
    public static Singleton1 getInstance() {
        return single;
    }
}

  这个模式在类初始化的时候就已经实例化了,保证了唯一一个实例,这是线程安全的。

2、简单了解了什么是单例模式后,我们来用一个具体实例看看,怎么样实现在JFrame界面切换的时候可以只有一个主窗体,而不需要,不停地实例化和销毁它。

  主类继承JFrame,所以直接实例化本类并显示就可以了。

 1 import javax.swing.JFrame;
 2 
 3 public class Singleton_ extends JFrame{
 4     private static Singleton_ single = null;
 5     //对外只暴露getInstance()方法,这是获取唯一实例方法。
 6     public static Singleton_ getInstance(){
 7         if(single==null)
 8             single = new Singleton_();
 9         return single;
10     }
11     public static void main(String args[]){
12         Singleton_ singleton_ = new Singleton_();//实例化唯一窗口与
13         singleton_.setTitle("单例模式窗口");
14         singleton_.setVisible(true);
15     }
16     //设为私有方法,防止被外部类引用或实例
17     private Singleton_(){
18         setBounds(100, 100, 461, 286);
19         setContentPane(Panel_01.getInstance(this));
20     }
21 }

  这是一个JPanel面板类,他也是一个单例模式,返回的是一个JPanel实例。

 1 import java.awt.event.ActionEvent;
 2 import java.awt.event.ActionListener;
 3 
 4 import javax.swing.JButton;
 5 import javax.swing.JFrame;
 6 import javax.swing.JPanel;
 7 
 8 public class Panel_01 extends JPanel{
 9     private JButton but_01;
10     private JPanel jPanel;
11     private Panel_01(final JFrame jFrame){
12         setLayout(null);
13         System.out.println("正常");
14         but_01 = new JButton("界面1");
15         //点击事件
16         but_01.addActionListener(new ActionListener() {
17             
18             @Override
19             public void actionPerformed(ActionEvent e) {
20                 if(e.getSource()==but_01){
21                     jFrame.setContentPane(Panel_02.getInstance(jFrame));
22                     jFrame.validate();//使面板生效,刷新
23                 }
24             }
25         });
26         but_01.setBounds(120, 45, 71, 28);
27         jPanel = new JPanel();
28         jPanel.setLayout(null);
29         jPanel.setBounds(0, 76, 450, 224);
30         jPanel.add(but_01);
31         add(jPanel);
32     }
33     private static Panel_01 panel_01 = null;
34     public static Panel_01 getInstance(JFrame jFrame){
35         panel_01 = new Panel_01(jFrame);
36         return panel_01;
37     }
38 }

  第二个JPanel类

 1 import java.awt.event.ActionEvent;
 2 import java.awt.event.ActionListener;
 3 
 4 import javax.swing.JButton;
 5 import javax.swing.JFrame;
 6 import javax.swing.JLabel;
 7 import javax.swing.JPanel;
 8 
 9 public class Panel_02 extends JPanel{
10     private JLabel jLabel = null;
11     private JButton but_02 = null;
12     //私有方法
13     private Panel_02(JFrame jFrame){
14         jLabel = new JLabel("界面1");
15         jLabel.setBounds(0, 0, 100, 100);
16         but_02 = new JButton("返回");
17         //点击事件
18         but_02.addActionListener(new ActionListener() {
19             
20             @Override
21             public void actionPerformed(ActionEvent e) {
22                 if(e.getSource()==but_02){
23                     jFrame.setContentPane(Panel_01.getInstance(jFrame));
24                     jFrame.validate();//刷新
25                 }
26             }
27         });
28         jLabel.setBounds(100, 100, 100, 100);
29         add(but_02);
30         add(jLabel);
31     }
32     private static Panel_02 panel_02=null;
33     //对外接口
34     public static Panel_02 getInstance(JFrame jFrame){
35         panel_02 = new Panel_02(jFrame);
36         return panel_02;
37     }
38 }

  本个案例主要实现了类只有一个JFrame窗口,而在使用功能的时候,只有里面的JPanel面板不断的切换,不影响主窗体的状态。而且一般这种类型的界面最好都是采用单例模式会好一点。(这是本人第一次写博客,有不好的地方欢迎大家指出,我会不断改进更新的,谢谢!)

以上是关于用单例模式实现主JFrame不变,只有JPanel面板切换的主要内容,如果未能解决你的问题,请参考以下文章

关于Swing中JFrame或JPanel重写paint()方法后再在JFrame或JPanel中添加其他组件出现按钮等组件消失不见只有当鼠标扫过时才会出现的问题

理解php单例模式

理解php单例模式

为什么要用单例模式?

PHP用单例模式实现一个数据库类

java中jframe 和jpanel的区别