The Java Program: SortColumnHeaderRenderer.java

  1 import java.awt.Component;
  2 import java.awt.BorderLayout;
  3 
  4 import javax.swing.JPanel;
  5 import javax.swing.JTable;
  6 import javax.swing.SwingConstants;
  7 import javax.swing.LookAndFeel;
  8 import javax.swing.table.TableCellRenderer;
  9 import javax.swing.table.DefaultTableCellRenderer;
 10 import javax.swing.plaf.basic.BasicArrowButton;
 11 
 12 // requires SortTableModel
 13 
 14 public class SortColumnHeaderRenderer implements TableCellRenderer {
 15 
 16    protected final SortTableModel    model;
 17    protected final TableCellRenderer rend;
 18 
 19    public SortColumnHeaderRenderer (SortTableModel m, TableCellRenderer r) {
 20       model = m; rend = r;
 21    }
 22 
 23    public SortColumnHeaderRenderer (final SortTableModel m) {
 24       this (m, new DefaultTableCellRenderer());
 25    }
 26 
 27    public Component getTableCellRendererComponent (JTable table, Object value,
 28       boolean isSelected, boolean hasFocus, int row, int column) {
 29 
 30       final JPanel panel = new JPanel();
 31       LookAndFeel.installColorsAndFont (panel,
 32           "TableHeader.background",
 33           "TableHeader.foreground",
 34           "TableHeader.font");
 35       LookAndFeel.installBorder (panel, "TableHeader.cellBorder");
 36       panel.setLayout (new BorderLayout());
 37 
 38       final Component head = rend.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
 39       panel.add (head, BorderLayout.CENTER);
 40 
 41       // convert visible column index to a column index in the model
 42       final int index = table.convertColumnIndexToModel (column);
 43 
 44       if (index == model.getSortColumn()) {
 45          final int DIR = model.isSortAscending() ? SwingConstants.NORTH : SwingConstants.SOUTH;
 46          final BasicArrowButton bab = new BasicArrowButton (DIR);
 47          panel.add (bab, BorderLayout.EAST);
 48       }
 49       return panel;
 50    }
 51 }