java设计模式(2)--观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用
适合使用环境: 当自身发生改变时,通知其它对象,其他对象会跟着改变。例如: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;
??? }
}