表格进度条

package progress;


import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;


import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;


/**
 * 主程序
 * @author SavageGarden
 *
 */
public class SwingTest {


public static void main(String args[]) {
FrameTest frame = new FrameTest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
/**
 * 主面板,显示表格和按钮
 * @author SavageGarden
 *
 */
class FrameTest extends JFrame {
private static int WIDTH;
private static int HEIGHT;
public JButton addButton;
public JScrollPane statusScrollPane1;
public static JTable statusTable;
public static StatusTableModel statusTableModel;
public static String showValue = "0:0";
public static ProgressBarObservable progressBarObservable;
public static ProgressBarObserver progressBarObserver; 
public static volatile int count; 
public FrameTest() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
WIDTH = screenSize.width/2;
HEIGHT = screenSize.height/2;
setSize(WIDTH, HEIGHT+20);
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
setTitle("FrameTest");
setVisible(false);
createStatusPanel();
statusScrollPane1.setBounds(0, 0, WIDTH, 330);
getContentPane().add(statusScrollPane1);
addButton = new JButton("添加");
addButton.setBounds(WIDTH/2 -40, 350 , 80, 20);
addButton.addActionListener(new AddButtonActionListener());
getContentPane().add(addButton);

   progressBarObservable = new ProgressBarObservable();
   progressBarObserver = new ProgressBarObserver();
   progressBarObservable.addObserver(progressBarObserver);
}
/**
* 创建状态区
*
*/
private void createStatusPanel() {
statusTableModel = new StatusTableModel();
statusTable = new JTable(statusTableModel);
//设置"Status"列由定制的ProgressBarRenderer渲染
TableColumn statusColumn  = statusTable.getColumn("Status");
statusColumn .setCellRenderer(new ProgressBarRenderer());
statusScrollPane1 = new JScrollPane(statusTable);

}
/**
* 状态区表格模型类
* @author SavageGarden
*
*/
class StatusTableModel extends DefaultTableModel {
public Object[] rowData = {"..", 0, "", "", ""};
public StatusTableModel() {
super();
addColumn("Name");
addColumn("Status");
addColumn("Size");
addColumn("Speed");
}
/**
* 设置为不可编辑
*/
public boolean isCellEditable(int row, int column) {
       return false;
   }
/**
* 向状态区添加一个进度条
*
*/
public void addProgressBar() {
rowData[0] = "文件" + (this.getRowCount() + 1);
addRow(rowData);
}
}
/**
* 按钮的事件响应类
* @author SavageGarden
*
*/
class AddButtonActionListener implements ActionListener {


public void actionPerformed(ActionEvent event) {
statusTableModel.addProgressBar();
Thread t = new ProgressBarThread(); 
t.start();
Thread thread = new Thread(new Runnable() {

@Override
public void run() {

int i =0;
while(i<1000)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i);
count = i++;
}
}
});
thread.start();
}

}
/**
* 工具条的渲染器
* @author SavageGarden
*
*/
class ProgressBarRenderer extends DefaultTableCellRenderer{
private static final long serialVersionUID = 1L;
   private final JProgressBar b;
   public ProgressBarRenderer(){
    super();
       setOpaque(true);
       b = new JProgressBar();
//是否显示进度字符串
b.setStringPainted(true);
b.setMinimum(0);
b.setMaximum(100);
//是否绘制边框
b.setBorderPainted(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;
       b.setValue(i);
       return b;
   }
}
/**
* 进度条线程
* @author SavageGarden
*
*/
class ProgressBarThread extends Thread {
int price = 0;
int rowIndex = statusTableModel.getRowCount()-1;
public void run() {

while (price < 100) {  
           try {  
               Thread.sleep(100);  
           } catch (InterruptedException e) {  
               e.printStackTrace();  
           }  
           price ++;
           SwingUtilities.invokeLater(new Runnable(){
               public void run() {  
                //statusTableModel.setValueAt(price, index, 1);  
//                 progressBarObservable.setShowValue(rowIndex + ":" + price);
                progressBarObservable.setShowValue(rowIndex + ":" + count);
               }  
           });
       }  
}
}

/**
* 用于实现观察者观察的对象---进度条的显示值
* @author SavageGarden
*
*/
class ProgressBarObservable extends Observable {


private String showValue;
   public String getShowValue() {
       return showValue;
   }
   public void setShowValue(String showValue) {
       this.showValue = showValue;
       setChanged();
       notifyObservers(showValue);
   }
}
/**
* 用于实现观察者 ---进度条的显示值变化时更新statusTableModel
* @author SavageGarden
*
*/
class ProgressBarObserver implements Observer {
public void update(Observable o, Object arg) {
String showValue = (String)arg;
            statusTableModel.setValueAt(Integer.parseInt(showValue.split(":")[1]), Integer.parseInt(showValue.split(":")[0]), 1);
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值