欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java单例模式实现面板切换

程序员文章站 2024-04-02 08:55:16
本文实例为大家分享了java单例模式实现面板切换的具体代码,供大家参考,具体内容如下 1、首先介绍一下什么是单例模式:   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,所以直接实例化本类并显示就可以了。

import javax.swing.jframe;

public class singleton_ extends jframe{
  private static singleton_ single = null;
  //对外只暴露getinstance()方法,这是获取唯一实例方法。
  public static singleton_ getinstance(){
    if(single==null)
      single = new singleton_();
    return single;
  }
  public static void main(string args[]){
    singleton_ singleton_ = new singleton_();//实例化唯一窗口与
    singleton_.settitle("单例模式窗口");
    singleton_.setvisible(true);
  }
  //设为私有方法,防止被外部类引用或实例
  private singleton_(){
    setbounds(100, 100, 461, 286);
    setcontentpane(panel_01.getinstance(this));
  }
}

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

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");
    //点击事件
    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("返回");
    //点击事件
    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;
  }
}

  本个案例主要实现了类只有一个jframe窗口,而在使用功能的时候,只有里面的jpanel面板不断的切换,不影响主窗体的状态。而且一般这种类型的界面最好都是采用单例模式会好一点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。