<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java究竟怎么玩?

      天地程序已定棋,人間大數待變局

        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理
        我們在多文件下載或多事務處理時,經常會出現使用線程以提高效率的情況,而這時在GUI程序中如何表示進度,就成了一個不大不小的問題。
        現在比較被大眾接受的方式,大體就是如迅雷等下載工具中一樣,用表格中加載進度條以進行顯示。
        而對于Swing來說,并沒有現成的組件能夠實現這一操作,還有下載的并發,似乎也需要額外進行處理。于是,我在此提供一個基于jdk1.6版本的示例,以供參考。(因為jdk1.6提供了SwingWorker,簡化了圖形程序中的線程處理,使用其他jdk開發請替換此項即可)

      本示例由兩個java文件組成

      MyTableModel.java
      package org.loon.test;

      import java.awt.Component;
      import java.util.HashMap;
      import java.util.Map;

      import javax.swing.BorderFactory;
      import javax.swing.JProgressBar;
      import javax.swing.JTable;
      import javax.swing.SwingWorker;
      import javax.swing.table.DefaultTableCellRenderer;
      import javax.swing.table.DefaultTableModel;

      /**
       * <p>
       * Title: LoonFramework
       * </p>
       * <p>
       * Description:
       * </p>
       * <p>
       * Copyright: Copyright (c) 2007
       * </p>
       * <p>
       * Company: LoonFramework
       * </p>
       * 
       * 
      @author chenpeng
       * @email:ceponline@yahoo.com.cn
       * 
      @version 0.1
       
      */

      public class MyTableModel extends DefaultTableModel {
          
      /**
           * 
           
      */

          
      private static final long serialVersionUID = 1L;

          
      private static final ColumnContext[] columnArray = {
                  
      new ColumnContext("ID", Integer.classfalse),
                  
      new ColumnContext("名稱", String.classfalse),
                  
      new ColumnContext("進度", Integer.classfalse) }
      ;

          
      private final Map<Integer, SwingWorker> swmap = new HashMap<Integer, SwingWorker>();

          
      private int number = 0;

          
      public void addTest(Test t, SwingWorker worker) {
              Object[] obj 
      = new Integer(number), t.getName(), t.getProgress() };
              
      super.addRow(obj);
              swmap.put(number, worker);
              number
      ++;
          }


          
      public synchronized SwingWorker getSwingWorker(int identifier) {
              Integer key 
      = (Integer) getValueAt(identifier, 0);
              
      return swmap.get(key);
          }


          
      public Test getTest(int identifier) {
              
      return new Test((String) getValueAt(identifier, 1),
                      (Integer) getValueAt(identifier, 
      2));
          }


          
      public boolean isCellEditable(int row, int col) {
              
      return columnArray[col].isEditable;
          }



          
      public Class<?> getColumnClass(int modelIndex) {
              
      return columnArray[modelIndex].columnClass;
          }


          
      public int getColumnCount() {
              
      return columnArray.length;
          }


          
      public String getColumnName(int modelIndex) {
              
      return columnArray[modelIndex].columnName;
          }


          
      private static class ColumnContext {
              
      public final String columnName;

              
      public final Class columnClass;

              
      public final boolean isEditable;

              
      public ColumnContext(String columnName, Class columnClass,
                      
      boolean isEditable) {
                  
      this.columnName = columnName;
                  
      this.columnClass = columnClass;
                  
      this.isEditable = isEditable;
              }

          }

      }


      class Test {
          
      private String name;

          
      private Integer progress;

          
      public Test(String name, Integer progress) {
              
      this.name = name;
              
      this.progress = progress;
          }


          
      public void setName(String str) {
              name 
      = str;
          }


          
      public void setProgress(Integer str) {
              progress 
      = str;
          }


          
      public String getName() {
              
      return name;
          }


          
      public Integer getProgress() {
              
      return progress;
          }

      }


      class ProgressRenderer extends DefaultTableCellRenderer {
          
      /**
           * 
           
      */

          
      private static final long serialVersionUID = 1L;
          
      private final JProgressBar b = new JProgressBar(0100);

          
      public ProgressRenderer() {
              
      super();
              setOpaque(
      true);
              b.setBorder(BorderFactory.createEmptyBorder(
      1111));
          }


          
      public Component getTableCellRendererComponent(JTable table, Object value,
                  
      boolean isSelected, boolean hasFocus, int row, int column) {
              Integer i 
      = (Integer) value;
              String text 
      = "完成";
              
      if (i < 0{
                  
      //刪除
                  text = "取消完畢";
              }
       else if (i < 100{
                  b.setValue(i);
                  
      return b;
              }

              
      super.getTableCellRendererComponent(table, text, isSelected, hasFocus,
                      row, column);
              
      return this;
          }

      }


      MyPanel.java
      package org.loon.test;

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Component;
      import java.awt.Dimension;
      import java.awt.EventQueue;
      import java.awt.event.ActionEvent;
      import java.util.HashSet;
      import java.util.Random;

      import javax.swing.AbstractAction;
      import javax.swing.Action;
      import javax.swing.Icon;
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.JPopupMenu;
      import javax.swing.JScrollPane;
      import javax.swing.JSeparator;
      import javax.swing.JTable;
      import javax.swing.RowFilter;
      import javax.swing.SwingWorker;
      import javax.swing.WindowConstants;
      import javax.swing.table.TableCellRenderer;
      import javax.swing.table.TableColumn;
      import javax.swing.table.TableRowSorter;

      //import org.loon.framework.dll.NativeLoader;

      /**
       * <p>
       * Title: LoonFramework
       * </p>
       * <p>
       * Description:
       * </p>
       * <p>
       * Copyright: Copyright (c) 2007
       * </p>
       * <p>
       * Company: LoonFramework
       * </p>
       * 
       * 
      @author chenpeng
       * @email:ceponline@yahoo.com.cn
       * 
      @version 0.1
       
      */

      public class MyPanel extends JPanel {
          
      /**
           * 
           
      */

          
      private static final long serialVersionUID = 1L;

          
      private static final Color evenColor = new Color(250250250);

          
      private final MyTableModel model = new MyTableModel();

          
      private final TableRowSorter<MyTableModel> sorter = new TableRowSorter<MyTableModel>(
                  model);

          
      private final JTable table;

          
      public MyPanel() {
              
      super(new BorderLayout());
              table 
      = new JTable(model) {
                  
      /**
                   * 
                   
      */

                  
      private static final long serialVersionUID = 1L;

                  
      public Component prepareRenderer(
                          TableCellRenderer tableCellRenderer, 
      int row, int column) {
                      Component component 
      = super.prepareRenderer(tableCellRenderer, row,
                              column);
                      
      //背景色及字體設置
                      if (isRowSelected(row)) {
                          component.setForeground(getSelectionForeground());
                          component.setBackground(getSelectionBackground());
                      }
       else {
                          component.setForeground(getForeground());
                          component.setBackground((row 
      % 2 == 0? evenColor : table
                                  .getBackground());
                      }

                      
      return component;
                  }


                  
      public JPopupMenu getComponentPopupMenu() {
                      
      return makePopup();
                  }

              }
      ;
              table.setRowSorter(sorter);
              model.addTest(
      new Test("進度條測試"100), null);

              
      // 滾動條
              JScrollPane scrollPane = new JScrollPane(table);
              
      // 背景色
              scrollPane.getViewport().setBackground(Color.black);
              
      // 彈出菜單
              table.setComponentPopupMenu(new JPopupMenu());
              
      // 是否始終大到足以填充封閉視口的高度
              table.setFillsViewportHeight(true);
              
      // 將單元格間距的高度和寬度設置為指定的Dimension
              table.setIntercellSpacing(new Dimension());
              
      // 是否繪制單元格間的水平線
              table.setShowHorizontalLines(true);
              
      // 是否繪制單元格間的垂直線
              table.setShowVerticalLines(false);
              
      // 停止編輯時重新定義焦點,避免TableCellEditor丟失數據
              table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
              
      // 表示JTable中列的所有屬性,如寬度、大小可調整性、最小和最大寬度等。
              TableColumn column = table.getColumnModel().getColumn(0);
              column.setMaxWidth(
      60);
              column.setMinWidth(
      60);
              column.setResizable(
      false);
              column 
      = table.getColumnModel().getColumn(2);
              
      // 繪制此列各值的TableCellRenderer
              column.setCellRenderer(new ProgressRenderer());

              
      // 添加按鈕
              add(new JButton(new CreateNewAction("添加"null)), BorderLayout.SOUTH);
              add(scrollPane, BorderLayout.CENTER);
              setPreferredSize(
      new Dimension(320180));
          }


          
      class CreateNewAction extends AbstractAction {
              
      /**
               * 
               
      */

              
      private static final long serialVersionUID = 1L;

              
      public CreateNewAction(String label, Icon icon) {
                  
      super(label, icon);
              }


              
      public void actionPerformed(ActionEvent evt) {
                  createNewActionPerformed(evt);
              }

          }


          
      /**
           * 創建事件
           * 
      @param evt
           
      */

          
      private void createNewActionPerformed(ActionEvent evt) {
              
      final int key = model.getRowCount();
              
      //在jdk1.6后,當一個Swing程序需要執行一個多線程任務時,可以通過javax.swing.SwingWorker實例進行實現。
              
      //SwingWorker的process可以定義約束屬性。更改這些屬性將觸發事件,并從事件調度線程上引起事件處理方法的調用。
              
      //SwingWorker的done方法,在后臺任務完成時自動的在事件調度線程上被調用。
              SwingWorker<Integer, Integer> worker = new SwingWorker<Integer, Integer>() {
                  
      // 隨機sleep
                  private int sleepDummy = new Random().nextInt(100+ 1;

                  
      // 最大任務數量
                  private int taskSize = 200;

                  
      protected Integer doInBackground() {
                      
      int current = 0;
                      
      while (current < taskSize && !isCancelled()) {
                          current
      ++;
                          
      try {
                              Thread.sleep(sleepDummy);
                          }
       catch (InterruptedException ie) {
                              publish(
      -1);
                              
      break;
                          }

                          publish(
      100 * current / taskSize);
                      }

                      
      return sleepDummy * taskSize;
                  }


                  
      /**
                   * 進行中處理
                   
      */

                  
      protected void process(java.util.List<Integer> data) {
                      
      for (Integer value : data) {
                          
      // 把數據填入對應的行列
                          model.setValueAt(value, key, 2);
                      }

                      
      // 傳送變更事件給指定行列
                      model.fireTableCellUpdated(key, 2);
                  }


                  
      /**
                   * 完成后處理
                   
      */

                  
      protected void done() {
                  }

              }
      ;
              model.addTest(
      new Test("進度條測試"0), worker);
              worker.execute();
          }


          
      class CancelAction extends AbstractAction {
              
      /**
               * 
               
      */

              
      private static final long serialVersionUID = 1L;

              
      public CancelAction(String label, Icon icon) {
                  
      super(label, icon);
              }


              
      public void actionPerformed(ActionEvent evt) {
                  cancelActionPerformed(evt);
              }

          }


          
      /**
           * 取消進度
           * 
      @param evt
           
      */

          
      public synchronized void cancelActionPerformed(ActionEvent evt) {
              
      int[] selection = table.getSelectedRows();
              
      if (selection == null || selection.length <= 0)
                  
      return;
              
      for (int i = 0; i < selection.length; i++{
                  
      int midx = table.convertRowIndexToModel(selection[i]);
                  SwingWorker worker 
      = model.getSwingWorker(midx);
                  
      if (worker != null && !worker.isDone()) {
                      worker.cancel(
      true);
                  }

                  worker 
      = null;
              }

              table.repaint();
          }


          
      /**
           * 取消下載進程
           * 
           * 
      @author chenpeng
           * 
           
      */

          
      class DeleteAction extends AbstractAction {
              
      /**
               * 
               
      */

              
      private static final long serialVersionUID = 1L;

              
      public DeleteAction(String label, Icon icon) {
                  
      super(label, icon);
              }


              
      public void actionPerformed(ActionEvent evt) {
                  deleteActionPerformed(evt);
              }

          }


          
      private final HashSet<Integer> set = new HashSet<Integer>();

          
      public synchronized void deleteActionPerformed(ActionEvent evt) {
              
      int[] selection = table.getSelectedRows();
              
      if (selection == null || selection.length <= 0)
                  
      return;
              
      for (int i = 0; i < selection.length; i++{
                  
      int midx = table.convertRowIndexToModel(selection[i]);
                  set.add(midx);
                  SwingWorker worker 
      = model.getSwingWorker(midx);
                  
      if (worker != null && !worker.isDone()) {
                      worker.cancel(
      true);
                  }

                  worker 
      = null;
              }

              
      // JTable過濾器
              final RowFilter<MyTableModel, Integer> filter = new RowFilter<MyTableModel, Integer>() {

                  
      public boolean include(
                          Entry
      <? extends MyTableModel, ? extends Integer> entry) {
                      Integer midx 
      = entry.getIdentifier();
                      
      return !set.contains(midx);
                  }

              }
      ;
              sorter.setRowFilter(filter);
              table.repaint();
          }


          
      private JPopupMenu makePopup() {
              JPopupMenu pop 
      = new JPopupMenu();
              Action act 
      = new CreateNewAction("添加"null);
              pop.add(act);
              act 
      = new CancelAction("取消"null);
              
      int[] selection = table.getSelectedRows();
              
      if (selection == null || selection.length <= 0)
                  act.setEnabled(
      false);
              pop.add(act);
              
      // 分割線
              pop.add(new JSeparator());
              act 
      = new DeleteAction("刪除"null);
              
      if (selection == null || selection.length <= 0)
                  act.setEnabled(
      false);
              pop.add(act);
              
      return pop;
          }


          
      public static void main(String[] args) {
              EventQueue.invokeLater(
      new Runnable() {
                  
      public void run() {
                      createGUI();
                  }

              }
      );
          }


          
      public static void createGUI() {

              JFrame frame 
      = new JFrame("在JTable中加載進度條及進行操作");
              frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
              frame.getContentPane().add(
      new MyPanel());
              frame.setSize(
      400400);
              
      // 透明度90%
              
      // NativeLoader.getInstance().setTransparence(frame, 0.9f);
              
      // 居中
              frame.setLocationRelativeTo(null);
              frame.setVisible(
      true);

          }

      }


      運行效果如下:

      posted on 2007-12-24 16:39  cping  閱讀(389)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品偷伦费观看一次| 少妇久久久被弄到高潮| 另类图片亚洲人妻中文无码| 日韩精品人妻黄色一级片| 国产一区二区三区不卡在线看| 中文字幕一区二区精品区| 丰满少妇人妻久久久久久| 人妻内射一区二区在线视频| 大又大又粗又硬又爽少妇毛片 | 亚洲a免费| 亚洲a免费| 四虎成人免费视频在线播放 | 欧美喷水抽搐magnet| 伊人久久大香线蕉综合网| 377p欧洲日本亚洲大胆 | 国产成人精品久久一区二区| 性男女做视频观看网站| 精品国产精品中文字幕| 精品乱码一区内射人妻无码| 国产国产人免费人成免费| 欧美奶涨边摸边做爰视频| 国产在线中文字幕精品| 无码熟妇αⅴ人妻又粗又大| 国产精品尤物乱码一区二区| 欧美性群另类交| 亚洲av永久无码精品漫画| 四房播色综合久久婷婷| 久久精品国产字幕高潮| 无码中文字幕人妻在线一区| 中文字幕日韩精品有码视频 | 日韩av爽爽爽久久久久久| 婷婷六月天在线| 成人欧美一区二区三区在线| 四川丰满少妇无套内谢| 日本欧美大码a在线观看| 给我免费观看片在线| 久久综合九色综合97伊人| 色播久久人人爽人人爽人人片av| 国产一区二区不卡视频在线| 亚洲一区成人av在线| 在线天堂最新版资源|