JProgressBarのCellRenderer

 JTableのセルにJProgressBarを表示する。

 ■ソースコード
 以下のとおり。
 私は、計算の進捗表示に使うことが多い。
 ProgressMonitorでも良いのですが、複数の計算をスレッドで並列的に計算する場合は、それぞれの計算進捗をJTableで表示しています。

package test;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class JProgressCellRenderer extends JProgressBar implements TableCellRenderer {

	private static final long serialVersionUID = 1L;

	public JProgressCellRenderer(int min, int max){
		super(min, max);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected,boolean hasFocus, int row, int column){
		if(value instanceof Number){
			setValue(((Number) value).intValue());
		}
		return this;
	}

	public static JProgressCellRenderer install(JTable table,int min,int max){
		JProgressCellRenderer renderer=new JProgressCellRenderer(min,max);
		table.setDefaultRenderer(JProgressBar.class, renderer);
		table.setRowHeight((int) renderer.getPreferredSize().getHeight());
		return renderer;
	}
	
	public static void main(String[] args){
		JFrame f=new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JTable tb=new JTable();
		final DefaultTableModel model=new DefaultTableModel(){
			private static final long serialVersionUID = 1L;
			@Override
			public boolean isCellEditable(int arg0, int arg1) {
				return false;
			}
			@Override
			public Class<?> getColumnClass(int arg0) {
				if(arg0==1){
					return JProgressBar.class;
				}else{
					return super.getColumnClass(arg0);
				}
			}
			
		};
		model.setColumnCount(2);
		model.setRowCount(1);
		model.setColumnIdentifiers(new String[]{"Name","Value"});
		JProgressCellRenderer rend=JProgressCellRenderer.install(tb, 0, 100);
		rend.setStringPainted(true);
		model.setValueAt("Progress", 0, 0);
		model.setValueAt(rend, 0, 1);
		tb.setModel(model);
		f.getContentPane().setLayout(new BorderLayout());
		f.getContentPane().add(new JScrollPane(tb),BorderLayout.CENTER);
		f.setTitle("Test");
		f.setSize(300,200);
		f.setLocationRelativeTo(null);
		f.addComponentListener(new ComponentListener(){
			int id=0;
			@Override
			public void componentHidden(ComponentEvent arg0) {}
			@Override
			public void componentMoved(ComponentEvent arg0) {}
			@Override
			public void componentResized(ComponentEvent arg0) {}
			@Override
			public void componentShown(ComponentEvent arg0) {
				Runnable r=new Runnable(){
					public void run(){
						while(id<100){
							model.setValueAt(++id, 0, 1);
							try{
								Thread.sleep(250);
							}catch(Exception e){
								e.printStackTrace();
							}
						}
					}
				};
				new Thread(r).start();
			}
		});
		f.setVisible(true);
	}
	
}

 ■結果
 こんな感じ。