Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 444|回复: 0

[Swing学习]在JTable中加载多个进度条及进行操作

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-10 23:57:03 | 显示全部楼层 |阅读模式
    我们在多文件下载或多事务处理时,经常会出现使用线程以提高效率的情况,而这时在GUI程序中如何表示进度,就成了一个不大不小的问题。

          现在比较被大众接受的方式,大体就是如迅雷等下载工具中一样,用表格中加载进度条以进行显示。

       而对于Swing来说,并没有现成的组件能够实现这一操作,还有下载的并发,似乎也需要额外进行处理。于是,我在此提供一个基于jdk1.6版本的示例,以供参考。(因为jdk1.6提供了SwingWorker,简化了图形程序中的线程处理,使用其他jdk开发请替换此项即可)

    本示例由两个java文件组成

    MyTableModel.java
    1. package org.loon.test;
    2. import java.awt.Component;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.swing.BorderFactory;
    6. import javax.swing.JProgressBar;
    7. import javax.swing.JTable;
    8. import javax.swing.SwingWorker;
    9. import javax.swing.table.DefaultTableCellRenderer;
    10. import javax.swing.table.DefaultTableModel;
    11. /*
    12. * @author chenpeng
    13. * @email:ceponline@yahoo.com.cn
    14. * @version 0.1
    15. */
    16. public class MyTableModel extends DefaultTableModel {
    17.     /** *//**
    18.      *
    19.      */
    20.     private static final long serialVersionUID = 1L;
    21.     private static final ColumnContext[] columnArray = {
    22.             new ColumnContext("ID", Integer.class, false),
    23.             new ColumnContext("名称", String.class, false),
    24.             new ColumnContext("进度", Integer.class, false) };
    25.     private final Map< Integer, SwingWorker> swmap =
    26.         new HashMap< Integer, SwingWorker>();
    27.     private int number = 0;
    28.     public void addTest(Test t, SwingWorker worker) {
    29.         Object[] obj = { new Integer(number), t.getName(), t.getProgress() };
    30.         super.addRow(obj);
    31.         swmap.put(number, worker);
    32.         number++;
    33.     }
    34.     public synchronized SwingWorker getSwingWorker(int identifier) {
    35.         Integer key = (Integer) getValueAt(identifier, 0);
    36.         return swmap.get(key);
    37.     }
    38.     public Test getTest(int identifier) {
    39.         return new Test((String) getValueAt(identifier, 1),
    40.                 (Integer) getValueAt(identifier, 2));
    41.     }
    42.     public boolean isCellEditable(int row, int col) {
    43.         return columnArray[col].isEditable;
    44.     }
    45.     public Class< ?> getColumnClass(int modelIndex) {
    46.         return columnArray[modelIndex].columnClass;
    47.     }
    48.     public int getColumnCount() {
    49.         return columnArray.length;
    50.     }
    51.     public String getColumnName(int modelIndex) {
    52.         return columnArray[modelIndex].columnName;
    53.     }
    54.     private static class ColumnContext {
    55.         public final String columnName;
    56.         public final Class columnClass;
    57.         public final boolean isEditable;
    58.         public ColumnContext(String columnName, Class columnClass,
    59.                 boolean isEditable) {
    60.             this.columnName = columnName;
    61.             this.columnClass = columnClass;
    62.             this.isEditable = isEditable;
    63.         }
    64.     }
    65. }
    66. class Test {
    67.     private String name;
    68.     private Integer progress;
    69.     public Test(String name, Integer progress) {
    70.         this.name = name;
    71.         this.progress = progress;
    72.     }
    73.     public void setName(String str) {
    74.         name = str;
    75.     }
    76.     public void setProgress(Integer str) {
    77.         progress = str;
    78.     }
    79.     public String getName() {
    80.         return name;
    81.     }
    82.     public Integer getProgress() {
    83.         return progress;
    84.     }
    85. }
    86. class ProgressRenderer extends DefaultTableCellRenderer {
    87.     /** *//**
    88.      *
    89.      */
    90.     private static final long serialVersionUID = 1L;
    91.     private final JProgressBar b = new JProgressBar(0, 100);
    92.     public ProgressRenderer() {
    93.         super();
    94.         setOpaque(true);
    95.         b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
    96.     }
    97.     public Component getTableCellRendererComponent(JTable table, Object value,
    98.             boolean isSelected, boolean hasFocus, int row, int column) {
    99.         Integer i = (Integer) value;
    100.         String text = "完成";
    101.         if (i < 0) {
    102.             //删除
    103.             text = "取消完毕";
    104.         } else if (i < 100) {
    105.             b.setValue(i);
    106.             return b;
    107.         }
    108.         super.getTableCellRendererComponent(table, text, isSelected, hasFocus,
    109.                 row, column);
    110.         return this;
    111.     }
    112. }                     
    复制代码
      
      
       
       
         
       

         
       
      
       MyPanel.java
    1. package org.loon.test;
    2. import java.awt.BorderLayout;
    3. import java.awt.Color;
    4. import java.awt.Component;
    5. import java.awt.Dimension;
    6. import java.awt.EventQueue;
    7. import java.awt.event.ActionEvent;
    8. import java.util.HashSet;
    9. import java.util.Random;
    10. import javax.swing.AbstractAction;
    11. import javax.swing.Action;
    12. import javax.swing.Icon;
    13. import javax.swing.JButton;
    14. import javax.swing.JFrame;
    15. import javax.swing.JPanel;
    16. import javax.swing.JPopupMenu;
    17. import javax.swing.JScrollPane;
    18. import javax.swing.JSeparator;
    19. import javax.swing.JTable;
    20. import javax.swing.RowFilter;
    21. import javax.swing.SwingWorker;
    22. import javax.swing.WindowConstants;
    23. import javax.swing.table.TableCellRenderer;
    24. import javax.swing.table.TableColumn;
    25. import javax.swing.table.TableRowSorter;

    26. / *
    27. * @author chenpeng
    28. * @email:ceponline@yahoo.com.cn
    29. * @version 0.1
    30. */

    31. public class MyPanel extends JPanel {
    32.     /** *//**
    33.      *
    34.      */
    35.     private static final long serialVersionUID = 1L;
    36.     private static final Color evenColor = new Color(250, 250, 250);
    37.     private final MyTableModel model = new MyTableModel();
    38.     private final TableRowSorter
    39.    sorter = new TableRowSorter
    40.   
    41.    (
    42.             model);
    43.     private final JTable table;
    44.     public MyPanel() {
    45.         super(new BorderLayout());
    46.         table = new JTable(model) {
    47.             /** *//**
    48.              *
    49.              */
    50.             private static final long serialVersionUID = 1L;
    51.             public Component prepareRenderer(
    52.                     TableCellRenderer tableCellRenderer, int row, int column) {
    53.                 Component component = super.prepareRenderer(tableCellRenderer, row,
    54.                         column);
    55.                 //背景色及字体设置
    56.                 if (isRowSelected(row)) {
    57.                     component.setForeground(getSelectionForeground());
    58.                     component.setBackground(getSelectionBackground());
    59.                 } else {
    60.                     component.setForeground(getForeground());
    61.                     component.setBackground((row % 2 == 0) ? evenColor : table
    62.                             .getBackground());
    63.                 }
    64.                 return component;
    65.             }
    66.             public JPopupMenu getComponentPopupMenu() {
    67.                 return makePopup();
    68.             }
    69.         };
    70.         table.setRowSorter(sorter);
    71.         model.addTest(new Test("进度条测试", 100), null);
    72.         // 滚动条
    73.         JScrollPane scrollPane = new JScrollPane(table);
    74.         // 背景色
    75.         scrollPane.getViewport().setBackground(Color.black);
    76.         // 弹出菜单
    77.         table.setComponentPopupMenu(new JPopupMenu());
    78.         // 是否始终大到足以填充封闭视口的高度
    79.         table.setFillsViewportHeight(true);
    80.         // 将单元格间距的高度和宽度设置为指定的Dimension
    81.         table.setIntercellSpacing(new Dimension());
    82.         // 是否绘制单元格间的水平线
    83.         table.setShowHorizontalLines(true);
    84.         // 是否绘制单元格间的垂直线
    85.         table.setShowVerticalLines(false);
    86.         // 停止编辑时重新定义焦点,避免TableCellEditor丢失数据
    87.         table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    88.         // 表示JTable中列的所有属性,如宽度、大小可调整性、最小和最大宽度等。
    89.         TableColumn column = table.getColumnModel().getColumn(0);
    90.         column.setMaxWidth(60);
    91.         column.setMinWidth(60);
    92.         column.setResizable(false);
    93.         column = table.getColumnModel().getColumn(2);
    94.         // 绘制此列各值的TableCellRenderer
    95.         column.setCellRenderer(new ProgressRenderer());
    96.         // 添加按钮
    97.         add(new JButton(new CreateNewAction("添加", null)), BorderLayout.SOUTH);
    98.         add(scrollPane, BorderLayout.CENTER);
    99.         setPreferredSize(new Dimension(320, 180));
    100.     }
    101.     class CreateNewAction extends AbstractAction {
    102.         /** *//**
    103.          *
    104.          */
    105.         private static final long serialVersionUID = 1L;
    106.         public CreateNewAction(String label, Icon icon) {
    107.             super(label, icon);
    108.         }
    109.         public void actionPerformed(ActionEvent evt) {
    110.             createNewActionPerformed(evt);
    111.         }
    112.     }
    113.     /** *//**
    114.      * 创建事件
    115.      * @param evt
    116.      */
    117.     private void createNewActionPerformed(ActionEvent evt) {
    118.         final int key = model.getRowCount();
    119.         //在jdk1.6后,当一个Swing程序需要执行一个多线程任务时,可以通过javax.swing.SwingWorker实例进行实现。
    120.         //SwingWorker的process可以定义约束属性。更改这些属性将触发事件,并从事件调度线程上引起事件处理方法的调用。
    121.         //SwingWorker的done方法,在后台任务完成时自动的在事件调度线程上被调用。
    122.         SwingWorker< Integer, Integer> worker = new SwingWorker< Integer, Integer>() {
    123.             // 随机sleep
    124.             private int sleepDummy = new Random().nextInt(100) + 1;
    125.             // 最大任务数量
    126.             private int taskSize = 200;
    127.             protected Integer doInBackground() {
    128.                 int current = 0;
    129.                 while (current < taskSize && !isCancelled()) {
    130.                     current++;
    131.                     try {
    132.                         Thread.sleep(sleepDummy);
    133.                     } catch (InterruptedException ie) {
    134.                         publish(-1);
    135.                         break;
    136.                     }
    137.                     publish(100 * current / taskSize);
    138.                 }
    139.                 return sleepDummy * taskSize;
    140.             }
    141.             /** *//**
    142.              * 进行中处理
    143.              */
    144.             protected void process(java.util.List
    145.    
    146.      data) {
    147.                 for (Integer value : data) {
    148.                     // 把数据填入对应的行列
    149.                     model.setValueAt(value, key, 2);
    150.                 }
    151.                 // 传送变更事件给指定行列
    152.                 model.fireTableCellUpdated(key, 2);
    153.             }
    154.             /** *//**
    155.              * 完成后处理
    156.              */
    157.             protected void done() {
    158.             }
    159.         };
    160.         model.addTest(new Test("进度条测试", 0), worker);
    161.         worker.execute();
    162.     }
    163.     class CancelAction extends AbstractAction {
    164.         /** *//**
    165.          *
    166.          */
    167.         private static final long serialVersionUID = 1L;
    168.         public CancelAction(String label, Icon icon) {
    169.             super(label, icon);
    170.         }
    171.         public void actionPerformed(ActionEvent evt) {
    172.             cancelActionPerformed(evt);
    173.         }
    174.     }
    175.     /** *//**
    176.      * 取消进度
    177.      * @param evt
    178.      */
    179.     public synchronized void cancelActionPerformed(ActionEvent evt) {
    180.         int[] selection = table.getSelectedRows();
    181.         if (selection == null || selection.length <= 0)
    182.             return;
    183.         for (int i = 0; i < selection.length; i++) {
    184.             int midx = table.convertRowIndexToModel(selection[i]);
    185.             SwingWorker worker = model.getSwingWorker(midx);
    186.             if (worker != null && !worker.isDone()) {
    187.                 worker.cancel(true);
    188.             }
    189.             worker = null;
    190.         }
    191.         table.repaint();
    192.     }
    193.     /** *//**
    194.      * 取消下载进程
    195.      *
    196.      * @author chenpeng
    197.      *
    198.      */
    199.     class DeleteAction extends AbstractAction {
    200.         /** *//**
    201.          *
    202.          */
    203.         private static final long serialVersionUID = 1L;
    204.         public DeleteAction(String label, Icon icon) {
    205.             super(label, icon);
    206.         }
    207.         public void actionPerformed(ActionEvent evt) {
    208.             deleteActionPerformed(evt);
    209.         }
    210.     }
    211.     private final HashSet
    212.    
    213.       set = new HashSet
    214.      
    215.       ();
    216.     public synchronized void deleteActionPerformed(ActionEvent evt) {
    217.         int[] selection = table.getSelectedRows();
    218.         if (selection == null || selection.length <= 0)
    219.             return;
    220.         for (int i = 0; i < selection.length; i++) {
    221.             int midx = table.convertRowIndexToModel(selection[i]);
    222.             set.add(midx);
    223.             SwingWorker worker = model.getSwingWorker(midx);
    224.             if (worker != null && !worker.isDone()) {
    225.                 worker.cancel(true);
    226.             }
    227.             worker = null;
    228.         }
    229.         // JTable过滤器
    230.         final RowFilter< MyTableModel, Integer> filter = new RowFilter< MyTableModel, Integer>() {
    231.             public boolean include(
    232.                     Entry< ? extends MyTableModel, ? extends Integer> entry) {
    233.                 Integer midx = entry.getIdentifier();
    234.                 return !set.contains(midx);
    235.             }
    236.         };
    237.         sorter.setRowFilter(filter);
    238.         table.repaint();
    239.     }
    240.     private JPopupMenu makePopup() {
    241.         JPopupMenu pop = new JPopupMenu();
    242.         Action act = new CreateNewAction("添加", null);
    243.         pop.add(act);
    244.         act = new CancelAction("取消", null);
    245.         int[] selection = table.getSelectedRows();
    246.         if (selection == null || selection.length <= 0)
    247.             act.setEnabled(false);
    248.         pop.add(act);
    249.         // 分割线
    250.         pop.add(new JSeparator());
    251.         act = new DeleteAction("删除", null);
    252.         if (selection == null || selection.length <= 0)
    253.             act.setEnabled(false);
    254.         pop.add(act);
    255.         return pop;
    256.     }
    257.     public static void main(String[] args) {
    258.         EventQueue.invokeLater(new Runnable() {
    259.             public void run() {
    260.                 createGUI();
    261.             }
    262.         });
    263.     }
    264.     public static void createGUI() {
    265.         JFrame frame = new JFrame("在JTable中加载进度条及进行操作");
    266.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    267.         frame.getContentPane().add(new MyPanel());
    268.         frame.setSize(400, 400);
    269.         // 透明度90%
    270.         // NativeLoader.getInstance().setTransparence(frame, 0.9f);
    271.         // 居中
    272.         frame.setLocationRelativeTo(null);
    273.         frame.setVisible(true);
    274.     }
    275. }
    276.      
    277.    
    278.    
    279.   
    复制代码
    运行效果如下:



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/10/235702750.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 08:05 , Processed in 0.290619 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表