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 閱讀(3030) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 洛隆县| 图片| 吴旗县| 安岳县| 岗巴县| 琼中| 浦江县| 汝州市| 广昌县| 西峡县| 绍兴县| 成安县| 高台县| 神木县| 增城市| 通州市| 延庆县| 双流县| 满洲里市| 广河县| 钟祥市| 土默特左旗| 务川| 山阴县| 连南| 安福县| 富宁县| 民和| 佳木斯市| 文登市| 开平市| 耒阳市| 永兴县| 璧山县| 通江县| 山东省| 讷河市| 阿尔山市| 大荔县| 西峡县| 武乡县|