import javax.swing.*; import javax.swing.table.*; import javax.swing.border.*; import java.awt.*; /**** * * Play around with an implementation of TableCellRenderer that supports * expand/collapse of column headings. See <a href= * "../TableCellRendererLabel.java"> the code </a> for details. * <p> * Note: This class egregiously fails to follow 206 documentation standards. * It would receive about 62/100 as a 206 milestone deliverable. * * @author Gene Fisher (gfisher@calpoly.edu) * @version 8feb05 * */ public class TableCellRendererLabel extends JLabel implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { this.row = row; this.column = column; myTable = (ExpandableCollapsableJTable) table; myTable.setBackground(new Color(0,255,0)); myTable.setForeground(null); myTable.setOpaque(false); String stringValue = value.toString(); setText(" " + stringValue + " "); setBorder(null); // Regarding direct access to the isExpanded data field -- consider the // myTable class to be a "friend" in the C++ sense of the word. if ((myTable.isExpanded && row <= 1) || (!myTable.isExpanded && row <= 0)) { setFont(new Font(getFont().getName(), Font.BOLD, getFont().getSize())); } else { setForeground(Color.black); setFont(new Font(getFont().getName(), Font.PLAIN, getFont().getSize())); } return this; } protected void paintComponent(Graphics g) { if (myTable.isExpanded) { if (row == 0 || row == 1) { g.setColor(new Color(240,240,240)); g.fillRect(0,0, getWidth(),getHeight()); g.setColor(Color.black); } else { if (row % 2 == 0) { g.setColor(new Color(240,240,255)); } else { g.setColor(Color.white); } g.fillRect(0,0, getWidth(),getHeight()); g.setColor(Color.black); } } else { if (row == 0) { g.setColor(new Color(240,240,240)); g.fillRect(0,0, getWidth(),getHeight()); g.setColor(Color.black); } else { if (row % 2 == 1) { g.setColor(new Color(240,240,255)); } else { g.setColor(Color.white); } g.fillRect(0,0, getWidth(),getHeight()); g.setColor(Color.black); } } if (myTable.isExpanded && row == 1 && (column == 0 || column == 4)) { } else { if ((myTable.isExpanded && row > 2) || !(myTable.isExpanded) && row > 1) { g.setColor(new Color(230,230,230)); } else { g.setColor(Color.black); } g.drawLine(0,0, getWidth(),0); g.setColor(Color.black); } if (myTable.isExpanded && row == 0 && (column == 0 || column == 4)) { } else { g.setColor(Color.green); // g.drawLine(0,getHeight(), getWidth(),getHeight()); g.setColor(Color.black); } if (!(row == 0 && (column == 2 || column == 3))) { g.setColor(Color.black); g.drawLine(0,0, 0,getHeight()); } else { // g.setColor(Color.white); // g.drawLine(0,0, 0,getHeight()); // g.setColor(Color.black); } if (!(row == 0 && !(column == 2 || column == 3 || column == 4))) { g.setColor(Color.black); g.drawLine(getWidth(),0, getWidth(),getHeight()); } else { // g.setColor(Color.white); // g.drawLine(getWidth(),0, getWidth(),getHeight()); // g.setColor(Color.black); } if ((myTable.isExpanded && row == 7) || (!(myTable.isExpanded) && row == 6)) { g.setColor(Color.black); g.drawLine(0,getHeight()-1, getWidth(),getHeight()-1); } super.paintComponent(g); } /** See JFC implementation not about why this and other methods are * overridden to be no-ops. */ public void validate() {} public void revalidate() {} public void repaint(long tm, int x, int y, int width, int height) {} public void repaint(Rectangle r) {} public void firePropertyChange( String name, Object oldVal, Object newVal) {} public void firePropertyChange( String name, boolean oldVal, boolean newVal) {} protected ExpandableCollapsableJTable myTable; protected int row; protected int column; }