java设计模式(2)--观察者模式Swing多线程事件处理进度条(一)

2014-11-24 02:53:00 · 作者: · 浏览: 0

适合使用环境: 当自身发生改变时,通知其它对象,其他对象会跟着改变。例如: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.getMaxi