Mega Code Archive

 
Categories / Java / Swing JFC
 

Table with a custom cell renderer and editor for the color data

/* From http://java.sun.com/docs/books/tutorial/index.html */ /*  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  * -Redistribution of source code must retain the above copyright notice, this  *  list of conditions and the following disclaimer.  *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation  *  and/or other materials provided with the distribution.  *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")  * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE  * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  *  * You acknowledge that this software is not designed, licensed or intended  * for use in the design, construction, operation or maintenance of any  * nuclear facility.  */ /*  * TableDialogEditDemo.java is a 1.4 application that requires these files:  *   ColorRenderer.java  *   ColorEditor.java  */ import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.Border; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; /**  * This is like TableDemo, except that it substitutes a  * Favorite Color column for the Last Name column and specifies  * a custom cell renderer and editor for the color data.  */ public class TableDialogEditDemo extends JPanel {     private boolean DEBUG = false;     public TableDialogEditDemo() {         super(new GridLayout(1,0));         JTable table = new JTable(new MyTableModel());         table.setPreferredScrollableViewportSize(new Dimension(500, 70));         //Create the scroll pane and add the table to it.         JScrollPane scrollPane = new JScrollPane(table);         //Set up renderer and editor for the Favorite Color column.         table.setDefaultRenderer(Color.class,                                  new ColorRenderer(true));         table.setDefaultEditor(Color.class,                                new ColorEditor());         //Add the scroll pane to this panel.         add(scrollPane);     }     class MyTableModel extends AbstractTableModel {         private String[] columnNames = {"First Name",                                         "Favorite Color",                                         "Sport",                                         "# of Years",                                         "Vegetarian"};         private Object[][] data = {             {"Mary", new Color(153, 0, 153),              "Snowboarding", new Integer(5), new Boolean(false)},             {"Alison", new Color(51, 51, 153),              "Rowing", new Integer(3), new Boolean(true)},             {"Kathy", new Color(51, 102, 51),              "Knitting", new Integer(2), new Boolean(false)},             {"Sharon", Color.red,              "Speed reading", new Integer(20), new Boolean(true)},             {"Philip", Color.pink,              "Pool", new Integer(10), new Boolean(false)}         };         public int getColumnCount() {             return columnNames.length;         }         public int getRowCount() {             return data.length;         }         public String getColumnName(int col) {             return columnNames[col];         }         public Object getValueAt(int row, int col) {             return data[row][col];         }         /*          * JTable uses this method to determine the default renderer/          * editor for each cell.  If we didn't implement this method,          * then the last column would contain text ("true"/"false"),          * rather than a check box.          */         public Class getColumnClass(int c) {             return getValueAt(0, c).getClass();         }         public boolean isCellEditable(int row, int col) {             //Note that the data/cell address is constant,             //no matter where the cell appears onscreen.             if (col < 1) {                 return false;             } else {                 return true;             }         }         public void setValueAt(Object value, int row, int col) {             if (DEBUG) {                 System.out.println("Setting value at " + row + "," + col                                    + " to " + value                                    + " (an instance of "                                    + value.getClass() + ")");             }             data[row][col] = value;             fireTableCellUpdated(row, col);             if (DEBUG) {                 System.out.println("New value of data:");                 printDebugData();             }         }         private void printDebugData() {             int numRows = getRowCount();             int numCols = getColumnCount();             for (int i=0; i < numRows; i++) {                 System.out.print("    row " + i + ":");                 for (int j=0; j < numCols; j++) {                     System.out.print("  " + data[i][j]);                 }                 System.out.println();             }             System.out.println("--------------------------");         }     }     /**      * Create the GUI and show it.  For thread safety,      * this method should be invoked from the      * event-dispatching thread.      */     private static void createAndShowGUI() {         //Make sure we have nice window decorations.         JFrame.setDefaultLookAndFeelDecorated(true);         //Create and set up the window.         JFrame frame = new JFrame("TableDialogEditDemo");         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         //Create and set up the content pane.         JComponent newContentPane = new TableDialogEditDemo();         newContentPane.setOpaque(true); //content panes must be opaque         frame.setContentPane(newContentPane);         //Display the window.         frame.pack();         frame.setVisible(true);     }     public static void main(String[] args) {         //Schedule a job for the event-dispatching thread:         //creating and showing this application's GUI.         javax.swing.SwingUtilities.invokeLater(new Runnable() {             public void run() {                 createAndShowGUI();             }         });     } } /*   * ColorRenderer.java (compiles with releases 1.2, 1.3, and 1.4) is used by   * TableDialogEditDemo.java.  */ class ColorRenderer extends JLabel                            implements TableCellRenderer {     Border unselectedBorder = null;     Border selectedBorder = null;     boolean isBordered = true;     public ColorRenderer(boolean isBordered) {         this.isBordered = isBordered;         setOpaque(true); //MUST do this for background to show up.     }     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;     } } /*   * ColorEditor.java (compiles with releases 1.3 and 1.4) is used by   * TableDialogEditDemo.java.  */  class ColorEditor extends AbstractCellEditor                          implements TableCellEditor,                   ActionListener {     Color currentColor;     JButton button;     JColorChooser colorChooser;     JDialog dialog;     protected static final String EDIT = "edit";     public ColorEditor() {         //Set up the editor (from the table's point of view),         //which is a button.         //This button brings up the color chooser dialog,         //which is the editor from the user's point of view.         button = new JButton();         button.setActionCommand(EDIT);         button.addActionListener(this);         button.setBorderPainted(false);         //Set up the dialog that the button brings up.         colorChooser = new JColorChooser();         dialog = JColorChooser.createDialog(button,                                         "Pick a Color",                                         true,  //modal                                         colorChooser,                                         this,  //OK button handler                                         null); //no CANCEL button handler     }     /**      * Handles events from the editor button and from      * the dialog's OK button.      */     public void actionPerformed(ActionEvent e) {         if (EDIT.equals(e.getActionCommand())) {             //The user has clicked the cell, so             //bring up the dialog.             button.setBackground(currentColor);             colorChooser.setColor(currentColor);             dialog.setVisible(true);             //Make the renderer reappear.             fireEditingStopped();         } else { //User pressed dialog's "OK" button.             currentColor = colorChooser.getColor();         }     }     //Implement the one CellEditor method that AbstractCellEditor doesn't.     public Object getCellEditorValue() {         return currentColor;     }     //Implement the one method defined by TableCellEditor.     public Component getTableCellEditorComponent(JTable table,                                                  Object value,                                                  boolean isSelected,                                                  int row,                                                  int column) {         currentColor = (Color)value;         return button;     } }