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

时间: 2024-10-07 13:13:21

用单例模式实现主JFrame不变,只有JPanel面板切换的相关文章

java,枯燥中遇见美丽JFrame,窗体(面板,JPanel)

package com.company; import javax.swing.*; import java.awt.*; public class Main extends JFrame {//JPanel面板 public Main(){ setBounds(100,100,500,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); Container c=getContentPane(); c.setLayout(n

关于JLable列表的自动滚动条的显示:当JLable列表的内容超出JPanel面板所规定的高度时,自动显示滚动条的方法

关于JLable列表的自动滚动条的显示:当JLable列表的内容超出JPanel面板所规定的高度时,自动显示滚动条的方法: 通过下面的方式把JLable表的宽度和高度锁死,不能根据列表内容的增加而自动出现滚动条: JPanel tablePanel = new JPanel(); JScrollPane jScrollPane1 = new JScrollPane(); JTable teacherTable = new JTable(); //表 teacherTable.setMaximum

delphi 程序实现主屏与扩展屏的切换

delphi 程序实现双屏显示主屏与扩展屏的切换: InitDevice: 初始化显示屏列表,成功返回显示屏数量: ActiveScreen:设置主显示屏,AIndex为显示屏索引,Align为扩展屏相对于主屏的位置(1:左 2:右 3:上 4:下): 使用到的winAPI:EnumDisplayDevicesA.EnumDisplaySettingsA.ChangeDisplaySettingsExA. 常量列表: CCHDEVICENAME = 32: DISPLAY_DEVICE_ATTA

Android 高仿微信6.0主界面 带你玩转切换图标变色

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41087219,本文出自:[张鸿洋的博客] 1.概述 学习Android少不了模仿各种app的界面,自从微信6.0问世以后,就觉得微信切换时那个变色的Tab图标屌屌的,今天我就带大家自定义控件,带你变色变得飞起~~ 好了,下面先看下效果图: 清晰度不太好,大家凑合看~~有木有觉得这个颜色弱爆了了的,,,下面我动动手指给你换个颜色: 有没有这个颜色比较妖一点~~~好了~下面开始介绍

keepalived weight正负值问题(实现主服务器nginx故障后迅速切换到备服务器)

有两台负载均衡,lb01,lb02.  lb02, priority值为100 编辑keepalived配置文件   vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 #定义节点名称,在一个高可用集群中不能重复 } vrrp_script check_web { script "/server/scripts/check_web.sh"

【转】Java 专业词汇

原址:http://blog.csdn.net/xiaojunjuns1/article/details/52729861 abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm                     n.算法 ['.lg.riem] annotation                     [Java

Java基础常见英语词汇

(转自http://www.jianshu.com/p/2743fe834166) Java基础常见英语词汇(共70个) ['?bd?ekt] ['?:rientid]导向的 ['pr??ɡr?m??]编程OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 [d?'vel?pm?nt][k?t]工具箱 ['v??tj??l]虚拟的JDK:Java development kit, java开发工具包 JVM:java

Java常用英语汇总(面试必备)

Java常用英语汇总(面试必备) abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]‘(n.入口,使用权) algorithm                     n.算法 ['.lg.riem] annotation                     [java]代码注释 [.n.u'tei..n] anonymous                

JAVA英语单词(带音标)

Java基础常见英语词汇(共70个) ['?bd?ekt] ['?:rientid]导向的                             ['pr??ɡr?m??]编程 OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 [d?'vel?pm?nt][k?t]工具箱                              ['v??tj??l]虚拟的 JDK:Java development kit, j