TableFontRendererとTableFontEditor

前回の続きで、Fontのレンダラーとエディタを実装する。
 なお、TableFontEditorには、以前に作ったFontDialogを使用する。

 ■ソースコード
 ソースコードは以下のとおり。
 ほぼ、前回と同じ。

・TableFontRenderer.java

package jp.t.matsuoka.swing.table;

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

public class TableFontRenderer extends JLabel implements TableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Border unselectedBorder = null;
	private Border selectedBorder = null;
	private boolean isBordered = true;
	
	public TableFontRenderer(boolean isBordered) {
		this.isBordered = isBordered;
		setOpaque(true);
		super.setText("Aa1");
	}
	
	public Component getTableCellRendererComponent(JTable arg0, Object arg1,
			boolean arg2, boolean arg3, int arg4, int arg5) {
		Font font=(Font)arg1;
		String family=font.getFamily();
		String style=getStyle(font.getStyle());
		String size=Integer.toString(font.getSize());
		super.setFont(font);
		setToolTipText(
			family+","+style+","+size);
		if (isBordered) {
			if (arg2) {
				if (selectedBorder == null) {
					selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
							arg0.getSelectionBackground());
				}
				setBorder(selectedBorder);
			} else {
				if (unselectedBorder == null) {
					unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
							arg0.getBackground());
				}
				setBorder(unselectedBorder);
			}
		}
		return this;
	}
	
	private String getStyle(int arg){
		switch(arg){
			case Font.PLAIN:
				return "PLAIN";
			case Font.BOLD:
				return "BOLD";
			case Font.ITALIC:
				return "ITALIC";
			default:
				return "ITALIC-BOLD";
		}
	}

}

・TableFontEditor.java

package test;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

public class TableFontEditor extends AbstractCellEditor implements
		TableCellEditor, ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Font currentFont;
	private JButton button;
	private JFontDialog dialog;
	private JTable currentTable;
	protected static final String EDIT = "edit";

	public TableFontEditor() {
		button = new JButton();
		button.setActionCommand(EDIT);
		button.addActionListener(this);
		button.setBorderPainted(false);
		dialog =new JFontDialog();
		dialog.setAlwaysOnTop(true);
	}
	
	public Component getTableCellEditorComponent(JTable arg0, Object arg1,
			boolean arg2, int arg3, int arg4) {
		currentFont = (Font)arg1;
		currentTable=arg0;
		return button;
	}

	public Object getCellEditorValue() {
		return currentFont;
	}

	public void actionPerformed(ActionEvent arg0) {
		button.setFont(currentFont);
		Font f=dialog.getFont(button);
		if(f!=null){
			currentFont=f;
			currentTable.setValueAt(currentFont, currentTable.getSelectedRow(),
					currentTable.getSelectedColumn());
			currentTable.removeEditor();
		}else{
			currentTable.removeEditor();
		}
	}

	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 Font.class;
				}else{
					return super.getColumnClass(arg0);
				}
			}
			
		};
		model.setColumnCount(2);
		model.setRowCount(1);
		model.setColumnIdentifiers(new String[]{"Name","Value"});
		tb.setDefaultEditor(Font.class, new TableFontEditor());
		tb.setDefaultRenderer(Font.class, new TableFontRenderer(true));
		model.setValueAt("Font", 0, 0);
		model.setValueAt(tb.getFont(), 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);
	}
}

 ■結果
 こんな感じ。