posts - 38,  comments - 22,  trackbacks - 0
      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之上
posted on 2007-04-17 11:44 aaabbb 阅读(3021) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: