{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); } }
■結果
以下のとおり。