- 浏览: 236342 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (268)
- oracle (15)
- 设计模式 (4)
- java (16)
- 线程(Thread) (1)
- 常用 (4)
- PL/SQL (1)
- SWING (10)
- 架构 (4)
- 正则表达式 (5)
- Linux (16)
- PostgreSQL (1)
- FTP (1)
- mysql (4)
- TOMCAT (5)
- 素材 (2)
- Hibernate (3)
- 报表打印 (1)
- 高并发,大数据量处理 (6)
- UML (1)
- memcache (3)
- JMF (1)
- 通信 (2)
- window常见问题处理 (5)
- eclipse (7)
- 数据库 (2)
- java内存 (4)
- maven (4)
- Spring (12)
- JavaScript (22)
- nodejs (5)
- OSGI (1)
- 其他 (1)
- 企业开发平台 (1)
- web页面懒加载 (3)
- VMware (2)
- hadoop (2)
- hadoop.hadoop学习笔记 (1)
- web前端 (32)
- vim (6)
- CSS (21)
- web前端.widget (2)
- Activiti (1)
- BPMN (1)
- Cookie (1)
- nigix (1)
- SVN (1)
最新评论
-
woodding2008:
太棒了
用一段代码演示马云双十一晚会上玩的纸牌魔术 -
nihaonihao1987:
[b][/b]
特别响、非常近——BPMN2新规范与Activiti5 -
coosummer:
推荐使用http://buttoncssgenerator.c ...
CSS Button -
tw_wangzhengquan:
ahua186186 写道compile 'com.oracl ...
ext4,spring,hibernate构建企业开发平台 -
ahua186186:
compile 'com.oracle:ojdbc14:10. ...
ext4,spring,hibernate构建企业开发平台
转自: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
发表评论
-
一个swing的分页组件
2012-05-07 14:33 2020一个swing的分页组件,代码见附件。 *用法如下: C ... -
free (一个swing写的ERP框架) --转载
2011-12-23 13:37 913一个swing写的ERP框架,运行主类free.Shell,界 ... -
swingx(一个Swing辅助类包)
2011-12-23 11:37 2757一个Swing辅助类包,运行org.jdesktop.demo ... -
一个复杂的JTable(转)
2011-12-20 12:02 1068一个复杂的JTable -
自动换行的TableCellRender
2011-11-30 08:57 1444import javax.swing.*; impo ... -
swing中设置JFrame的大小占满屏幕
2011-11-18 16:22 1557JFrame parentFrame=new JFram ... -
JButton 加事件监听(鼠标和键盘)
2011-11-16 13:40 2031ActionListener okListener=ne ... -
JTextField加DocumentListener监听
2011-11-16 12:04 1160DocumentListener textChangeL ... -
一个JTextArea的重构
2011-11-03 17:23 804package fr.itris.glips.svgedito ...
相关推荐
这个"java的applet带进度条表格示例"是一个经典的案例,它结合了Java Swing组件JTable和JProgressBar来创建一个交互式的表格,用户可以直观地看到表格中的某个任务或操作的进度。 首先,我们要了解JTable。JTable是...
在实际应用中,这段代码可以作为一个基础模板,根据具体需求进行扩展,如连接SQL Server数据库,执行SQL查询获取数据,然后将查询结果填充到JTable中。同时,可以通过调整`ShowModel`类来优化数据加载过程,例如批量...
在Java编程环境中,实现...综上所述,"JAVA实现的EXCEL表格导入数据录入"这个项目涵盖了Java开发中的多个重要技术,不仅涉及到数据库操作,还包括了文件处理、UI设计以及多线程等,对于提升开发者综合技能非常有益。
具体实现过程中,开发者会编写多个类,如Book类表示图书,User类表示用户,DatabaseManager类负责数据库操作。在启动程序时,初始化数据库连接,加载图书数据到内存,然后创建Swing的主窗口并显示。用户在界面上的...
3. **查询功能**:用户可能可以通过输入条件进行查询,系统使用SQL语句在后台执行查询,并在JTable中显示结果。 4. **数据库操作**:系统可能包含了添加、删除、更新记录的功能,这些都是通过与数据库API(如JDBC)...
总之,"Java写的一个mp3播放器.rar"项目展示了如何使用Java进行多媒体编程,结合了GUI设计、音频处理、文件操作和播放控制等多个技术点。学习这个项目可以帮助开发者深入理解Java在实际应用中的能力。
XPTable是一款功能强大的Java Swing组件,它扩展了标准的JTable类,提供了许多高级特性,使得在Java应用程序中创建复杂的表格视图变得容易。XPTable的源代码是开源的,因此开发者可以深入研究其内部机制,自定义和...
【基于J2SE的音乐播放器】是一种使用Java标准版(Java 2 Standard ...总的来说,开发这样一个音乐播放器涉及了Java GUI编程、音频处理、文件操作等多个方面的技术知识,充分展示了J2SE在桌面应用开发中的强大能力。
OpenSwing是Java GUI开发中的一个扩展库,它在标准的Java Swing库之上提供了一系列增强功能和组件,旨在提升用户界面的美观度和交互性。本文将深入探讨OpenSwing库中的关键组件及其使用方法,帮助开发者更好地理解和...
这个特定的版本"fbec295"可能代表了项目在某个特定时间点的代码快照,通常在Git或其他版本控制系统中,这样的哈希值用于标识代码库的特定历史状态。 在JIDE组件库中,以下几个关键知识点值得开发者关注: 1. **...
在超市管理系统中,Swing的组件如JFrame(窗口)、JPanel(面板)、JButton(按钮)、JTable(表格)等被广泛使用,以实现各种交互操作。此外,Swing还支持事件监听机制,使得用户与系统的交互变得更加灵活。 这个...
在这个模式中,客户端(通常是用户界面)与服务器端(处理业务逻辑和数据存储)进行交互。在"java的c/s结构的考试通过率统计"这个主题中,我们将探讨如何使用Java的Swing库来创建客户端应用程序,以及如何设计数据库...
本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型...
Java Swing 是Java编程语言中用于构建桌面应用程序用户界面的一个库,它是Java Foundation Classes (JFC) 的一部分。Swing 提供了丰富的组件集合,可以创建功能完备、具有现代外观的图形用户界面(GUI)。在本教程中...
7. 表格组件:JTable的使用,包括数据模型和列操作。 8. 树形视图:JTree组件的创建和数据模型的绑定。 9. 滚动面板:如何将组件放入JScrollPane中实现滚动功能。 10. 自定义组件:如何扩展Swing组件以实现个性化...
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java中多线程的核心概念包括线程的创建、生命周期以及如何控制线程。 #### 1.2 中断线程 中断线程是指通过某种方式让一个...