技术开发 频道

Swing 多线程事件处理进度条和Observer的一个具体应用

【IT168 技术文档】

    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(35422
));
            }

            
{
                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(39227
));
            }

            
{
                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(39290
);
            
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(
400300);
        }
 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;
    }

}


发现了一个1.5的新特性
如果传给dialog一个组件参数Com后,无论是否是模态都显示在Com之上

0
相关文章