java單例模式實(shí)現(xiàn)面板切換
本文實(shí)例為大家分享了java單例模式實(shí)現(xiàn)面板切換的具體代碼,供大家參考,具體內(nèi)容如下
1、首先介紹一下什么是單例模式:
java單例模式是一種常見的設(shè)計模式,那么我們先看看懶漢模式:
public class Singleton_ { //設(shè)為私有方法,防止被外部類引用或?qū)嵗? private Singleton_(){ System.out.println("懶漢單例模式"); } private static Singleton_ single = null; //并對外只暴露getInstance()方法,這是獲取唯一實(shí)例方法。 public static Singleton_ getInstance(){ if(single==null) single = new Singleton_(); return single; } }
這是沒有考慮線程安全問題的,因?yàn)樵诰€程并發(fā)的情況下,容易有多個實(shí)例,所以這是個線程不安全的模式。還有像餓漢模式這樣的:
//餓漢式單例類.在類初始化時,已經(jīng)自行實(shí)例化 public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new Singleton1(); //對外只暴露getInstance()方法,這是獲取唯一實(shí)例方法。 public static Singleton1 getInstance() { return single; } }
這個模式在類初始化的時候就已經(jīng)實(shí)例化了,保證了唯一一個實(shí)例,這是線程安全的。
2、簡單了解了什么是單例模式后,我們來用一個具體實(shí)例看看,怎么樣實(shí)現(xiàn)在JFrame界面切換的時候可以只有一個主窗體,而不需要,不停地實(shí)例化和銷毀它。
主類繼承JFrame,所以直接實(shí)例化本類并顯示就可以了。
import javax.swing.JFrame; public class Singleton_ extends JFrame{ private static Singleton_ single = null; //對外只暴露getInstance()方法,這是獲取唯一實(shí)例方法。 public static Singleton_ getInstance(){ if(single==null) single = new Singleton_(); return single; } public static void main(String args[]){ Singleton_ singleton_ = new Singleton_();//實(shí)例化唯一窗口與 singleton_.setTitle("單例模式窗口"); singleton_.setVisible(true); } //設(shè)為私有方法,防止被外部類引用或?qū)嵗? private Singleton_(){ setBounds(100, 100, 461, 286); setContentPane(Panel_01.getInstance(this)); } }
這是一個JPanel面板類,他也是一個單例模式,返回的是一個JPanel實(shí)例。
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Panel_01 extends JPanel{ private JButton but_01; private JPanel jPanel; private Panel_01(final JFrame jFrame){ setLayout(null); System.out.println("正常"); but_01 = new JButton("界面1"); //點(diǎn)擊事件 but_01.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==but_01){ jFrame.setContentPane(Panel_02.getInstance(jFrame)); jFrame.validate();//使面板生效,刷新 } } }); but_01.setBounds(120, 45, 71, 28); jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(0, 76, 450, 224); jPanel.add(but_01); add(jPanel); } private static Panel_01 panel_01 = null; public static Panel_01 getInstance(JFrame jFrame){ panel_01 = new Panel_01(jFrame); return panel_01; } }
第二個JPanel類
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Panel_02 extends JPanel{ private JLabel jLabel = null; private JButton but_02 = null; //私有方法 private Panel_02(JFrame jFrame){ jLabel = new JLabel("界面1"); jLabel.setBounds(0, 0, 100, 100); but_02 = new JButton("返回"); //點(diǎn)擊事件 but_02.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==but_02){ jFrame.setContentPane(Panel_01.getInstance(jFrame)); jFrame.validate();//刷新 } } }); jLabel.setBounds(100, 100, 100, 100); add(but_02); add(jLabel); } private static Panel_02 panel_02=null; //對外接口 public static Panel_02 getInstance(JFrame jFrame){ panel_02 = new Panel_02(jFrame); return panel_02; } }
本個案例主要實(shí)現(xiàn)了類只有一個JFrame窗口,而在使用功能的時候,只有里面的JPanel面板不斷的切換,不影響主窗體的狀態(tài)。而且一般這種類型的界面最好都是采用單例模式會好一點(diǎn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待
這篇文章主要介紹了Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10SpringBoot整合Mybatis-Plus實(shí)現(xiàn)微信注冊登錄的示例代碼
微信是不可或缺的通訊工具,本文主要介紹了SpringBoot整合Mybatis-Plus實(shí)現(xiàn)微信注冊登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的可以了解一下2024-02-02Spring?Boot項(xiàng)目中使用?TrueLicense?生成和驗(yàn)證License的詳細(xì)步驟
這篇文章主要介紹了Spring?Boot項(xiàng)目中使用?TrueLicense?生成和驗(yàn)證License,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-10-10Java 實(shí)現(xiàn)攔截器Interceptor的攔截功能方式
這篇文章主要介紹了Java 實(shí)現(xiàn)攔截器Interceptor的攔截功能方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot2零基礎(chǔ)到精通之?dāng)?shù)據(jù)庫專項(xiàng)精講
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇我們來學(xué)習(xí)如何連接數(shù)據(jù)庫進(jìn)行操作2022-03-03支付寶二面:使用?try-catch?捕獲異常會影響性能嗎(推薦)
這篇文章主要介紹了支付寶二面:使用?try-catch?捕獲異常會影響性能嗎,需要注意的是,JVM?中?異常處理的catch語句不再由字節(jié)碼指令來實(shí)現(xiàn)(很早之前通過?jsr和?ret指令來完成,需要的朋友可以參考下2023-03-03