用java单例模式实现面板切换

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面板不断的切换,不影响主窗体的状态。而且一般这种类型的界面最好都是采用单例模式会好一点。(这是本人第一次写博客,有不好的地方欢迎大家指出,我会不断改进更新的,谢谢!)

原文地址:https://www.cnblogs.com/caijh/p/6096240.html