`

在JTable中加载多个进度条及进行操作

 
阅读更多

转自:http://tech.it168.com/jd/2008-07-04/200807040908028.shtml

我们在多文件下载或多事务处理时,经常会出现使用线程以提高效率的情况,而这时在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;
  /*
  * @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.class, false),
  new ColumnContext("名称", String.class, false),
  new ColumnContext("进度", Integer.class, false) };
  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(0, 100);
  public ProgressRenderer() {
  super();
  setOpaque(true);
  b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
  }
  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;
  / *
  * @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(250, 250, 250);
  private final MyTableModel model = new MyTableModel();
  private final TableRowSorter sorter = new TableRowSorter(
  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(320, 180));
  }
  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 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 set = new HashSet();
  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(400, 400);
  // 透明度90%
  // NativeLoader.getInstance().setTransparence(frame, 0.9f);
  // 居中

  frame.setLocationRelativeTo(null);
  frame.setVisible(true);
  }
  }

 转自:http://tech.it168.com/jd/2008-07-04/200807040908028.shtml

  • 大小: 11.7 KB
分享到:
评论

相关推荐

    java的applet带进度条表格示例

    这个"java的applet带进度条表格示例"是一个经典的案例,它结合了Java Swing组件JTable和JProgressBar来创建一个交互式的表格,用户可以直观地看到表格中的某个任务或操作的进度。 首先,我们要了解JTable。JTable是...

    代码实现SQLServer数据库表中数据输出到图形用户界面归类.pdf

    在实际应用中,这段代码可以作为一个基础模板,根据具体需求进行扩展,如连接SQL Server数据库,执行SQL查询获取数据,然后将查询结果填充到JTable中。同时,可以通过调整`ShowModel`类来优化数据加载过程,例如批量...

    JAVA实现的EXCEL表格导入数据录入

    在Java编程环境中,实现...综上所述,"JAVA实现的EXCEL表格导入数据录入"这个项目涵盖了Java开发中的多个重要技术,不仅涉及到数据库操作,还包括了文件处理、UI设计以及多线程等,对于提升开发者综合技能非常有益。

    11、JavaSwing+MySQL的图书馆管理系统.zip

    具体实现过程中,开发者会编写多个类,如Book类表示图书,User类表示用户,DatabaseManager类负责数据库操作。在启动程序时,初始化数据库连接,加载图书数据到内存,然后创建Swing的主窗口并显示。用户在界面上的...

    Java Swing数据库管理系统

    3. **查询功能**:用户可能可以通过输入条件进行查询,系统使用SQL语句在后台执行查询,并在JTable中显示结果。 4. **数据库操作**:系统可能包含了添加、删除、更新记录的功能,这些都是通过与数据库API(如JDBC)...

    Java写的一个mp3播放器.rar

    总之,"Java写的一个mp3播放器.rar"项目展示了如何使用Java进行多媒体编程,结合了GUI设计、音频处理、文件操作和播放控制等多个技术点。学习这个项目可以帮助开发者深入理解Java在实际应用中的能力。

    XPTable源代码

    XPTable是一款功能强大的Java Swing组件,它扩展了标准的JTable类,提供了许多高级特性,使得在Java应用程序中创建复杂的表格视图变得容易。XPTable的源代码是开源的,因此开发者可以深入研究其内部机制,自定义和...

    基于J2SE的音乐播放器

    【基于J2SE的音乐播放器】是一种使用Java标准版(Java 2 Standard ...总的来说,开发这样一个音乐播放器涉及了Java GUI编程、音频处理、文件操作等多个方面的技术知识,充分展示了J2SE在桌面应用开发中的强大能力。

    OpenSwing java组件大全

    OpenSwing是Java GUI开发中的一个扩展库,它在标准的Java Swing库之上提供了一系列增强功能和组件,旨在提升用户界面的美观度和交互性。本文将深入探讨OpenSwing库中的关键组件及其使用方法,帮助开发者更好地理解和...

    java源码:开源的Swing组件 JIDE.zip

    这个特定的版本"fbec295"可能代表了项目在某个特定时间点的代码快照,通常在Git或其他版本控制系统中,这样的哈希值用于标识代码库的特定历史状态。 在JIDE组件库中,以下几个关键知识点值得开发者关注: 1. **...

    超市管理系统(Swing)

    在超市管理系统中,Swing的组件如JFrame(窗口)、JPanel(面板)、JButton(按钮)、JTable(表格)等被广泛使用,以实现各种交互操作。此外,Swing还支持事件监听机制,使得用户与系统的交互变得更加灵活。 这个...

    java的c/s结构的考试通过率统计

    在这个模式中,客户端(通常是用户界面)与服务器端(处理业务逻辑和数据存储)进行交互。在"java的c/s结构的考试通过率统计"这个主题中,我们将探讨如何使用Java的Swing库来创建客户端应用程序,以及如何设计数据库...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型...

    java swing

    Java Swing 是Java编程语言中用于构建桌面应用程序用户界面的一个库,它是Java Foundation Classes (JFC) 的一部分。Swing 提供了丰富的组件集合,可以创建功能完备、具有现代外观的图形用户界面(GUI)。在本教程中...

    Java Swing图形界面开发与案例详解

    7. 表格组件:JTable的使用,包括数据模型和列操作。 8. 树形视图:JTree组件的创建和数据模型的绑定。 9. 滚动面板:如何将组件放入JScrollPane中实现滚动功能。 10. 自定义组件:如何扩展Swing组件以实现个性化...

    Core Java 2 Volume II 7th Edition

    线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java中多线程的核心概念包括线程的创建、生命周期以及如何控制线程。 #### 1.2 中断线程 中断线程是指通过某种方式让一个...

Global site tag (gtag.js) - Google Analytics