适合使用环境: 当自身发生改变时,通知其它对象,其他对象会跟着改变。例如:swing中分页的程序,当你点击上一页下一页时需要重新激发事件,从数据库获得新数据时,等。
Swing的事件处理中,对于非常费时的处理如果不用多线程会造成主界面的阻塞,即界面一片白色,这样非常不好的,也是不提倡的,而起用多线程进行事件 处理又面临一个问题即如果通知用户事件处理的进度,是否处理完成,所以最好在处理的过程中给用户一提示,标明处理的进度信息。这种提示可以用进度条的信息 来表示出来,以下就是一个用进度条来标示事件进度的一个简单实例,这个例子中还使用了Observer模式
进度窗口:
package pro;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class Progress extends javax.swing.JDialog implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JProgressBar pro_JPB;
private JPanel btn_JP;
private JButton cancel_JB;
private JLabel show_JL;
NewJFrame jf;
public Progress(NewJFrame frame) {
super(frame, true);
this.jf = frame;
initGUI();
}
set se = new set();
private void initGUI() {
try {
se.addObserver(new setObserver());
BorderLayout thisLayout = new BorderLayout();
getContentPane().setLayout(thisLayout);
{
show_JL = new JLabel();
getContentPane().add(show_JL, BorderLayout.NORTH);
show_JL.setPreferredSize(new java.awt.Dimension(354, 22));
}
{
pro_JPB = new JProgressBar();
pro_JPB.setMinimum(0);
pro_JPB.setMaximum(100);
getContentPane().add(pro_JPB, BorderLayout.CENTER);
pro_JPB.setPreferredSize(new java.awt.Dimension(392, 27));
}
{
btn_JP = new JPanel();
getContentPane().add(btn_JP, BorderLayout.SOUTH);
{
cancel_JB = new JButton();
btn_JP.add(cancel_JB);
cancel_JB.setText(""u53d6"u6d88");
cancel_JB.addActionListener(this);
}
}
this.setBackground(Color.DARK_GRAY.brighter());
this.setUndecorated(true);
this.setSize(392, 90);
this.setLocationRelativeTo(null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setMinmum(int i) {
pro_JPB.setMinimum(i);
}
public void setMaxmem(int i) {
pro_JPB.setMaximum(i);
}
public void setVal(int i) {
se.setPrice(i);
}
/**
*
* set Class->function:观察者模式的具体应用
* 2007-4-17
*/
class set extends Observable {
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
setChanged();
notifyObservers(new Integer(price));
}
}
class setObserver implements Observer {
public void update(Observable obj, Object arg) {
if (arg instanceof Integer) {
int i = ((Integer) arg).intValue();
pro_JPB.setValue(i);
show_JL.setText((i - pro_JPB.getMinimum()) * 100
/ (float) (pro_JPB.getMaximum() - pro_JPB.getMinimum())
+ "%");
}
}
}
public void actionPerformed(ActionEvent e) {
jf.setTh_Flag(false);
this.setVisible(false);
}
}
主程序:
package pro;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class NewJFrame extends javax.swing.JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel cen_JP;
private JButton jb;
public static void main(String[] args) {
NewJFrame inst = new NewJFrame();
inst.setVisible(true);
}
public NewJFrame() {
super();
initGUI();
}
Progress pro;
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
cen_JP = new JPanel();
getContentPane().add(cen_JP, BorderLayout.CENTER);
{
jb = new JButton();
cen_JP.add(jb);
jb.setText("jButton1");
jbAction ja = new jbAction();
pro = new Progress(this);
jb.addActionListener(ja);
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
boolean th_Flag = true;
class jbAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
pro.setMaxmem(100);
pro.setMinmum(0);
new Thread() {
public void run() {
for (int i = 1; i < 100; i++) {
if (!isTh_Flag()) {
setTh_Flag(true);
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
pro.setVal(i);
System.out.println("===" + i);
}
}
}.start();
pro.setVal(0);
pro.setVisible(true);
}
}
public boolean isTh_Flag() {
return th_Flag;
}
public void setTh_Flag(boolean th_Flag) {
this.th_Flag = th_Flag;
}
}
分享到:
相关推荐
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
设计模式C++学习之观察者模式(Observer)
Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
l 启动一个线程轮询查看主题对象,发现改变主动去通知观察者对象 l 例子 便于大家理解举个例子并实现。代码为Java 代码,使用了Spring和JUnit。 l 需求 有一个小朋友叫小明。 妈妈每年要给他办生日派对, 爸爸...
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。 观察...
观察者设计模式,java语言实现,完全自己代码实现,未使用observable和observer
1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...
设计模式培训-observer
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
observer-pattern-demo 观察者模式示例
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式...
设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)