程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 用java單例模式實現面板切換,java例模式面板

用java單例模式實現面板切換,java例模式面板

編輯:JAVA綜合教程

用java單例模式實現面板切換,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面板不斷的切換,不影響主窗體的狀態。而且一般這種類型的界面最好都是采用單例模式會好一點。(這是本人第一次寫博客,有不好的地方歡迎大家指出,我會不斷改進更新的,謝謝!)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved