Mega Code Archive

 
Categories / Java / Swing Components
 

Column Border Table Example

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html /* (swing1.1) */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.AbstractBorder; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; /**  * @version 1.0 3/06/99  */ public class ColumnBorderTableExample extends JFrame {   public ColumnBorderTableExample() {     super("Column Border Example");     DefaultTableModel dm = new DefaultTableModel(4, 10);     JTable table = new JTable(dm);     table.setIntercellSpacing(new Dimension(0, 0));     Color color = table.getGridColor();     BorderCellRenderer[] renderers = new BorderCellRenderer[6];     renderers[0] = createRenderer(color, new Insets(0, 0, 0, 1));     renderers[1] = createRenderer(color, new Insets(0, 1, 0, 1));     renderers[2] = createRenderer(color, new Insets(0, 1, 0, 2));     renderers[3] = createRenderer(color, new Insets(0, 2, 0, 2));     renderers[4] = createRenderer(color, new Insets(0, 2, 0, 0));     renderers[5] = createRenderer(Color.red, new Insets(0, 1, 1, 1));     TableColumnModel model = table.getColumnModel();     model.getColumn(1).setCellRenderer(renderers[0]);     model.getColumn(2).setCellRenderer(renderers[0]);     model.getColumn(3).setCellRenderer(renderers[0]);     model.getColumn(4).setCellRenderer(renderers[1]);     model.getColumn(5).setCellRenderer(renderers[2]);     model.getColumn(6).setCellRenderer(renderers[3]);     model.getColumn(7).setCellRenderer(renderers[4]);     model.getColumn(8).setCellRenderer(renderers[5]);     JScrollPane scroll = new JScrollPane(table);     getContentPane().add(scroll, BorderLayout.CENTER);   }   public static void main(String[] args) {     ColumnBorderTableExample frame = new ColumnBorderTableExample();     frame.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     frame.setSize(300, 120);     frame.setVisible(true);   }   private static BorderCellRenderer createRenderer(Color color, Insets insets) {     BorderCellRenderer renderer = new BorderCellRenderer();     renderer.setColumnBorder(new LinesBorder(color, insets));     return renderer;   } } class BorderCellRenderer extends JLabel implements TableCellRenderer {   protected Border noFocusBorder;   protected Border columnBorder;   public BorderCellRenderer() {     noFocusBorder = new EmptyBorder(1, 2, 1, 2);     setOpaque(true);   }   public Component getTableCellRendererComponent(JTable table, Object value,       boolean isSelected, boolean hasFocus, int row, int column) {     if (isSelected) {       setForeground(table.getSelectionForeground());       setBackground(table.getSelectionBackground());     } else {       setForeground(table.getForeground());       setBackground(table.getBackground());     }     setFont(table.getFont());     if (hasFocus) {       setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));       if (table.isCellEditable(row, column)) {         setForeground(UIManager.getColor("Table.focusCellForeground"));         setBackground(UIManager.getColor("Table.focusCellBackground"));       }     } else {       if (value instanceof CellBorder) {         Border border = ((CellBorder) value).getBorder();         setBorder(border);       } else {         if (columnBorder != null) {           setBorder(columnBorder);         } else {           setBorder(noFocusBorder);         }       }     }     setText((value == null) ? "" : value.toString());     return this;   }   public void setColumnBorder(Border border) {     columnBorder = border;   }   public Border getColumnBorder() {     return columnBorder;   } } interface CellBorder {   public Border getBorder();   public Border getBorder(int row, int column);   public void setBorder(Border border);   public void setBorder(Border border, int row, int column); } class LinesBorder extends AbstractBorder implements SwingConstants {   protected int northThickness;   protected int southThickness;   protected int eastThickness;   protected int westThickness;   protected Color northColor;   protected Color southColor;   protected Color eastColor;   protected Color westColor;   public LinesBorder(Color color) {     this(color, 1);   }   public LinesBorder(Color color, int thickness) {     setColor(color);     setThickness(thickness);   }   public LinesBorder(Color color, Insets insets) {     setColor(color);     setThickness(insets);   }   public void paintBorder(Component c, Graphics g, int x, int y, int width,       int height) {     Color oldColor = g.getColor();     g.setColor(northColor);     for (int i = 0; i < northThickness; i++) {       g.drawLine(x, y + i, x + width - 1, y + i);     }     g.setColor(southColor);     for (int i = 0; i < southThickness; i++) {       g           .drawLine(x, y + height - i - 1, x + width - 1, y + height               - i - 1);     }     g.setColor(eastColor);     for (int i = 0; i < westThickness; i++) {       g.drawLine(x + i, y, x + i, y + height - 1);     }     g.setColor(westColor);     for (int i = 0; i < eastThickness; i++) {       g.drawLine(x + width - i - 1, y, x + width - i - 1, y + height - 1);     }     g.setColor(oldColor);   }   public Insets getBorderInsets(Component c) {     return new Insets(northThickness, westThickness, southThickness,         eastThickness);   }   public Insets getBorderInsets(Component c, Insets insets) {     return new Insets(northThickness, westThickness, southThickness,         eastThickness);   }   public boolean isBorderOpaque() {     return true;   }   public void setColor(Color c) {     northColor = c;     southColor = c;     eastColor = c;     westColor = c;   }   public void setColor(Color c, int direction) {     switch (direction) {     case NORTH:       northColor = c;       break;     case SOUTH:       southColor = c;       break;     case EAST:       eastColor = c;       break;     case WEST:       westColor = c;       break;     default:     }   }   public void setThickness(int n) {     northThickness = n;     southThickness = n;     eastThickness = n;     westThickness = n;   }   public void setThickness(Insets insets) {     northThickness = insets.top;     southThickness = insets.bottom;     eastThickness = insets.right;     westThickness = insets.left;   }   public void setThickness(int n, int direction) {     switch (direction) {     case NORTH:       northThickness = n;       break;     case SOUTH:       southThickness = n;       break;     case EAST:       eastThickness = n;       break;     case WEST:       westThickness = n;       break;     default:     }   }   public void append(LinesBorder b, boolean isReplace) {     if (isReplace) {       northThickness = b.northThickness;       southThickness = b.southThickness;       eastThickness = b.eastThickness;       westThickness = b.westThickness;     } else {       northThickness = Math.max(northThickness, b.northThickness);       southThickness = Math.max(southThickness, b.southThickness);       eastThickness = Math.max(eastThickness, b.eastThickness);       westThickness = Math.max(westThickness, b.westThickness);     }   }   public void append(Insets insets, boolean isReplace) {     if (isReplace) {       northThickness = insets.top;       southThickness = insets.bottom;       eastThickness = insets.right;       westThickness = insets.left;     } else {       northThickness = Math.max(northThickness, insets.top);       southThickness = Math.max(southThickness, insets.bottom);       eastThickness = Math.max(eastThickness, insets.right);       westThickness = Math.max(westThickness, insets.left);     }   } }