適合使用環境: 當自身發生改變時,通知其它對象,其他對象會跟著改變。例如: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;
}
}
作者“l12052124”