Mega Code Archive

 
Categories / Java / Swing Components
 

MultiLine Table

/* Core SWING Advanced Programming  By Kim Topley ISBN: 0 13 083292 8        Publisher: Prentice Hall   */ import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; public class MultiLineTable {   public static void main(String[] args) {     try {         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");     } catch (Exception evt) {}        JFrame f = new JFrame("Multi-line Cell Table");     JTable tbl = new JTable(new MultiLineTableModel());     // Create the custom cell renderer     MultiLineCellRenderer multiLineRenderer = new MultiLineCellRenderer(         SwingConstants.LEFT, SwingConstants.CENTER);     TableColumnModel tcm = tbl.getColumnModel();     tcm.getColumn(0).setPreferredWidth(75);     tcm.getColumn(0).setMinWidth(75);     tcm.getColumn(1).setPreferredWidth(150);     tcm.getColumn(1).setMinWidth(150);     // Install the multi-line renderer     tcm.getColumn(0).setCellRenderer(multiLineRenderer);     tcm.getColumn(1).setCellRenderer(multiLineRenderer);     // Set the table row height     tbl.setRowHeight(56);     // Add the stripe renderer.     StripedTableCellRenderer.installInTable(tbl, Color.lightGray,         Color.white, null, null);     tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);     tbl.setPreferredScrollableViewportSize(tbl.getPreferredSize());     JScrollPane sp = new JScrollPane(tbl);     f.getContentPane().add(sp, "Center");     f.pack();     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent evt) {         System.exit(0);       }     });     f.setVisible(true);   } } class MultiLineTableModel extends AbstractTableModel {   protected String[] columnNames = { "Flight", "Crew" };   // Implementation of TableModel interface   public int getRowCount() {     return data.length;   }   public int getColumnCount() {     return 2;   }   public Object getValueAt(int row, int column) {     return data[row][column];   }   public Class getColumnClass(int column) {     return (data[0][column]).getClass();   }   public String getColumnName(int column) {     return columnNames[column];   }   protected Object[][] data = new Object[][] {       {           "Apollo 11",           new String[] { "Neil Armstrong", "Buzz Aldrin",               "Michael Collins" } },       {           "Apollo 12",           new String[] { "Pete Conrad", "Alan Bean", "Richard Gordon" } },       {           "Apollo 13",           new String[] { "James Lovell", "Fred Haise", "Jack Swigert" } },       {           "Apollo 14",           new String[] { "Alan Shepard", "Edgar Mitchell",               "Stuart Roosa" } },       { "Apollo 15",           new String[] { "Dave Scott", "Jim Irwin", "Al Worden" } },       {           "Apollo 16",           new String[] { "John Young", "Charlie Duke",               "Ken Mattingly" } },       {           "Apollo 17",           new String[] { "Eugene Cernan", "Harrison Schmitt",               "Ron Evans" } } }; } class MultiLineCellRenderer extends JPanel implements TableCellRenderer {   public MultiLineCellRenderer(int horizontalAlignment, int verticalAlignment) {     this.horizontalAlignment = horizontalAlignment;     this.verticalAlignment = verticalAlignment;     switch (horizontalAlignment) {     case SwingConstants.LEFT:       alignmentX = (float) 0.0;       break;     case SwingConstants.CENTER:       alignmentX = (float) 0.5;       break;     case SwingConstants.RIGHT:       alignmentX = (float) 1.0;       break;     default:       throw new IllegalArgumentException(           "Illegal horizontal alignment value");     }     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));     setOpaque(true);     setBorder(border);     background = null;     foreground = null;   }   public void setForeground(Color foreground) {     super.setForeground(foreground);     Component[] comps = this.getComponents();     int ncomp = comps.length;     for (int i = 0; i < ncomp; i++) {       Component comp = comps[i];       if (comp instanceof JLabel) {         comp.setForeground(foreground);       }     }   }   public void setBackground(Color background) {     this.background = background;     super.setBackground(background);   }   public void setFont(Font font) {     this.font = font;   }   // Implementation of TableCellRenderer interface   public Component getTableCellRendererComponent(JTable table, Object value,       boolean isSelected, boolean hasFocus, int row, int column) {     removeAll();     invalidate();     if (value == null || table == null) {       // Do nothing if no value       return this;     }     Color cellForeground;     Color cellBackground;     // Set the foreground and background colors     // from the table if they are not set     cellForeground = (foreground == null ? table.getForeground()         : foreground);     cellBackground = (background == null ? table.getBackground()         : background);     // Handle selection and focus colors     if (isSelected == true) {       cellForeground = table.getSelectionForeground();       cellBackground = table.getSelectionBackground();     }     if (hasFocus == true) {       setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));       if (table.isCellEditable(row, column)) {         cellForeground = UIManager             .getColor("Table.focusCellForeground");         cellBackground = UIManager             .getColor("Table.focusCellBackground");       }     } else {       setBorder(border);     }     super.setForeground(cellForeground);     super.setBackground(cellBackground);     // Default the font from the table     if (font == null) {       font = table.getFont();     }     if (verticalAlignment != SwingConstants.TOP) {       add(Box.createVerticalGlue());     }     Object[] values;     int length;     if (value instanceof Object[]) {       // Input is an array - use it       values = (Object[]) value;     } else {       // Not an array - turn it into one       values = new Object[1];       values[0] = value;     }     length = values.length;     // Configure each row of the cell using     // a separate JLabel. If a given row is     // a JComponent, add it directly..     for (int i = 0; i < length; i++) {       Object thisRow = values[i];       if (thisRow instanceof JComponent) {         add((JComponent) thisRow);       } else {         JLabel l = new JLabel();         setValue(l, thisRow, i, cellForeground);         add(l);       }     }     if (verticalAlignment != SwingConstants.BOTTOM) {       add(Box.createVerticalGlue());     }     return this;   }   // Configures a label for one line of the cell.   // This can be overridden by derived classes   protected void setValue(JLabel l, Object value, int lineNumber,       Color cellForeground) {     if (value != null && value instanceof Icon) {       l.setIcon((Icon) value);     } else {       l.setText(value == null ? "" : value.toString());     }     l.setHorizontalAlignment(horizontalAlignment);     l.setAlignmentX(alignmentX);     l.setOpaque(false);     l.setForeground(cellForeground);     l.setFont(font);   }   protected int verticalAlignment;   protected int horizontalAlignment;   protected float alignmentX;   // These attributes may be explicitly set   // They are defaulted to the colors and attributes   // of the table   protected Color foreground;   protected Color background;   protected Font font;   protected static Border border = new EmptyBorder(1, 2, 1, 2); } class StripedTableCellRenderer implements TableCellRenderer {   public StripedTableCellRenderer(TableCellRenderer targetRenderer,       Color evenBack, Color evenFore, Color oddBack, Color oddFore) {     this.targetRenderer = targetRenderer;     this.evenBack = evenBack;     this.evenFore = evenFore;     this.oddBack = oddBack;     this.oddFore = oddFore;   }   // Implementation of TableCellRenderer interface   public Component getTableCellRendererComponent(JTable table, Object value,       boolean isSelected, boolean hasFocus, int row, int column) {     TableCellRenderer renderer = targetRenderer;     if (renderer == null) {       // Get default renderer from the table       renderer = table.getDefaultRenderer(table.getColumnClass(column));     }     // Let the real renderer create the component     Component comp = renderer.getTableCellRendererComponent(table, value,         isSelected, hasFocus, row, column);     // Now apply the stripe effect     if (isSelected == false && hasFocus == false) {       if ((row & 1) == 0) {         comp.setBackground(evenBack != null ? evenBack : table             .getBackground());         comp.setForeground(evenFore != null ? evenFore : table             .getForeground());       } else {         comp.setBackground(oddBack != null ? oddBack : table             .getBackground());         comp.setForeground(oddFore != null ? oddFore : table             .getForeground());       }     }     return comp;   }   // Convenience method to apply this renderer to single column   public static void installInColumn(JTable table, int columnIndex,       Color evenBack, Color evenFore, Color oddBack, Color oddFore) {     TableColumn tc = table.getColumnModel().getColumn(columnIndex);     // Get the cell renderer for this column, if any     TableCellRenderer targetRenderer = tc.getCellRenderer();     // Create a new StripedTableCellRenderer and install it     tc.setCellRenderer(new StripedTableCellRenderer(targetRenderer,         evenBack, evenFore, oddBack, oddFore));   }   // Convenience method to apply this renderer to an entire table   public static void installInTable(JTable table, Color evenBack,       Color evenFore, Color oddBack, Color oddFore) {     StripedTableCellRenderer sharedInstance = null;     int columns = table.getColumnCount();     for (int i = 0; i < columns; i++) {       TableColumn tc = table.getColumnModel().getColumn(i);       TableCellRenderer targetRenderer = tc.getCellRenderer();       if (targetRenderer != null) {         // This column has a specific renderer         tc.setCellRenderer(new StripedTableCellRenderer(targetRenderer,             evenBack, evenFore, oddBack, oddFore));       } else {         // This column uses a class renderer - use a shared renderer         if (sharedInstance == null) {           sharedInstance = new StripedTableCellRenderer(null,               evenBack, evenFore, oddBack, oddFore);         }         tc.setCellRenderer(sharedInstance);       }     }   }   protected TableCellRenderer targetRenderer;   protected Color evenBack;   protected Color evenFore;   protected Color oddBack;   protected Color oddFore; }