{Swing]TableColorRendererとTableColorEditor

 JTableで色を表示・選択するレンダラーとエディタを実装する。
 JTableは結構で使用頻度が高いので、色々なレンダラーとエディタを実装しておくと便利。

 ■ソースコード
 ソースコードは、以下のとおり。
 TableColorRendererは、JLabelを継承して作成する。
 TableColorEditorは、JButtonを介してJColorChooserを呼び出す。

・TableColorRenderer.java

package test;

import java.awt.Color;
import java.awt.Component;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;

public class TableColorRenderer extends JLabel implements TableCellRenderer {

	private static final long serialVersionUID = 1L;
	private Border unselectedBorder = null;
	private Border selectedBorder = null;
	private boolean isBordered = true;

	public TableColorRenderer(boolean isBordered) {
		this.isBordered = isBordered;
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(
			JTable table, Object color,boolean isSelected, boolean hasFocus,
				int row, int column) {
		Color newColor = (Color)color;
		setBackground(newColor);
		if (isBordered) {
			if (isSelected) {
				if (selectedBorder == null) {
					selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
							table.getSelectionBackground());
				}
				setBorder(selectedBorder);
			} else {
				if (unselectedBorder == null) {
					unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
							table.getBackground());
				}
				setBorder(unselectedBorder);
			}
		}
		setToolTipText("RGB value: " + newColor.getRed() + ", "
				+ newColor.getGreen() + ", "
				+ newColor.getBlue());
		return this;
	}

}

・TableColorEditor.java

package test;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class TableColorEditor extends AbstractCellEditor implements TableCellEditor,
		ActionListener {

	private static final long serialVersionUID = 1L;
	private Color currentColor;
	private JButton button;
	private JColorChooser colorChooser;
	private JDialog dialog;
	private JTable currentTable;
	private static final String EDIT = "edit";

	public TableColorEditor() {
		button = new JButton();
		button.setActionCommand(EDIT);
		button.addActionListener(this);
		button.setBorderPainted(false);
		colorChooser = new JColorChooser();
		dialog = JColorChooser.createDialog(button,"Color",true,
					colorChooser,this,null);
		dialog.setAlwaysOnTop(true);
	}

	public void actionPerformed(ActionEvent e) {
		if (EDIT.equals(e.getActionCommand())) {
			button.setBackground(currentColor);
			colorChooser.setColor(currentColor);
			dialog.setVisible(true);
			fireEditingStopped();
		} else {
			currentColor=colorChooser.getColor();
			currentTable.setValueAt(currentColor,currentTable.getSelectedRow(),
					currentTable.getSelectedColumn());
			currentTable.removeEditor();
		}
	}

	public Object getCellEditorValue() {
		return currentColor;
	}

	public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,
					int row,int column) {
		currentColor = (Color)value;
		currentTable=table;
		return button;
    }

	public void setCurrentColor(Color currentColor) {
		this.currentColor = currentColor;
	}

	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 (arg1==1);
			}
			@Override
			public Class<?> getColumnClass(int arg0) {
				if(arg0==1){
					return Color.class;
				}else{
					return super.getColumnClass(arg0);
				}
			}
			
		};
		model.setColumnCount(2);
		model.setRowCount(1);
		model.setColumnIdentifiers(new String[]{"Name","Value"});
		tb.setDefaultEditor(Color.class, new TableColorEditor());
		tb.setDefaultRenderer(Color.class, new TableColorRenderer(true));
		model.setValueAt("Color", 0, 0);
		model.setValueAt(Color.RED, 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.setVisible(true);
	}
}

 ■結果
 以下のとおり。