Mega Code Archive

 
Categories / Java / Swing Components
 

JSortTable

package org.tn5250j.gui; /*   JSortTable.java   Created by Claude Duguay   Copyright (c) 2002    This was taken from a Java Pro magazine article    http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208    I have NOT asked for permission to use this. */ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Collections; import java.util.Comparator; import java.util.Vector; import javax.swing.Icon; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; public class JSortTable extends JTable implements MouseListener {    protected int sortedColumnIndex = -1;    protected boolean sortedColumnAscending = true;    public JSortTable() {       this(new DefaultSortTableModel());    }    public JSortTable(int rows, int cols) {       this(new DefaultSortTableModel(rows, cols));    }    public JSortTable(Object[][] data, Object[] names) {       this(new DefaultSortTableModel(data, names));    }    public JSortTable(Vector data, Vector names) {       this(new DefaultSortTableModel(data, names));    }    public JSortTable(SortTableModel model) {       super(model);       initSortHeader();    }    public JSortTable(SortTableModel model, TableColumnModel colModel) {       super(model, colModel);       initSortHeader();    }    public JSortTable(SortTableModel model, TableColumnModel colModel,                            ListSelectionModel selModel) {       super(model, colModel, selModel);       initSortHeader();    }    protected void initSortHeader() {       JTableHeader header = getTableHeader();       header.setDefaultRenderer(new SortHeaderRenderer());       header.addMouseListener(this);    }    public int getSortedColumnIndex() {       return sortedColumnIndex;    }    public boolean isSortedColumnAscending() {       return sortedColumnAscending;    }    public void mouseReleased(MouseEvent event) {       TableColumnModel colModel = getColumnModel();       int index = colModel.getColumnIndexAtX(event.getX());       int modelIndex = colModel.getColumn(index).getModelIndex();       SortTableModel model = (SortTableModel)getModel();       if (model.isSortable(modelIndex)) {          // toggle ascension, if already sorted          if (sortedColumnIndex == index) {             sortedColumnAscending = !sortedColumnAscending;          }          sortedColumnIndex = index;          model.sortColumn(modelIndex, sortedColumnAscending);       }    }    public void mousePressed(MouseEvent event) {}    public void mouseClicked(MouseEvent event) {}    public void mouseEntered(MouseEvent event) {}    public void mouseExited(MouseEvent event) {} } /*   DefaultSortTableModel.java   Created by Claude Duguay   Copyright (c) 2002    This was taken from a Java Pro magazine article    http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208    I have NOT asked for permission to use this. */  class DefaultSortTableModel  extends DefaultTableModel                                     implements SortTableModel {    public DefaultSortTableModel() {}    public DefaultSortTableModel(int rows, int cols) {       super(rows, cols);    }    public DefaultSortTableModel(Object[][] data, Object[] names) {       super(data, names);    }    public DefaultSortTableModel(Object[] names, int rows) {       super(names, rows);    }    public DefaultSortTableModel(Vector names, int rows) {       super(names, rows);    }    public DefaultSortTableModel(Vector data, Vector names) {       super(data, names);    }    public boolean isSortable(int col) {       return true;    }    public void sortColumn(int col, boolean ascending) {       Collections.sort(getDataVector(),          new ColumnComparator(col, ascending));    } }  /*      SortTableModel.java    Created by Claude Duguay    Copyright (c) 2002     This was taken from a Java Pro magazine article     http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208     I have NOT asked for permission to use this.    */   interface SortTableModel extends TableModel {     public boolean isSortable(int col);     public void sortColumn(int col, boolean ascending);  }   /*        ColumnComparator.java     Created by Claude Duguay     Copyright (c) 2002      This was taken from a Java Pro magazine article      http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208      I have NOT asked for permission to use this.      */    class ColumnComparator implements Comparator {      protected int index;      protected boolean ascending;      public ColumnComparator(int index, boolean ascending) {         this.index = index;         this.ascending = ascending;      }      public int compare(Object one, Object two) {         if (one instanceof Vector && two instanceof Vector) {            Vector vOne = (Vector)one;            Vector vTwo = (Vector)two;            Object oOne = vOne.elementAt(index);            Object oTwo = vTwo.elementAt(index);            if (oOne instanceof Comparable && oTwo instanceof Comparable) {               Comparable cOne = (Comparable)oOne;               Comparable cTwo = (Comparable)oTwo;               if (ascending) {                  return cOne.compareTo(cTwo);               }               else {                  return cTwo.compareTo(cOne);               }            }         }         return 1;      }   }    /*          SortHeaderRenderer.java      Created by Claude Duguay      Copyright (c) 2002       This was taken from a Java Pro magazine article       http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208       I have NOT asked for permission to use this.        */     class SortHeaderRenderer extends DefaultTableCellRenderer {       public static Icon NONSORTED =  new SortArrowIcon(SortArrowIcon.NONE);       public static Icon ASCENDING =  new SortArrowIcon(SortArrowIcon.ASCENDING);       public static Icon DECENDING =  new SortArrowIcon(SortArrowIcon.DECENDING);       public SortHeaderRenderer() {          setHorizontalTextPosition(LEFT);          setHorizontalAlignment(CENTER);       }       public Component getTableCellRendererComponent( JTable table,                                  Object value,                                  boolean isSelected,                                  boolean hasFocus, int row, int col) {          int index = -1;          boolean ascending = true;          if (table instanceof JSortTable) {             JSortTable sortTable = (JSortTable)table;             index = sortTable.getSortedColumnIndex();             ascending = sortTable.isSortedColumnAscending();          }          if (table != null) {             JTableHeader header = table.getTableHeader();             if (header != null) {                setForeground(header.getForeground());                setBackground(header.getBackground());                setFont(header.getFont());             }          }          Icon icon = ascending ? ASCENDING : DECENDING;          setIcon(col == index ? icon : NONSORTED);          setText((value == null) ? "" : value.toString());          setBorder(UIManager.getBorder("TableHeader.cellBorder"));          return this;       }    }     /*            SortArrowIcon.java       Created by Claude Duguay       Copyright (c) 2002        This was taken from a Java Pro magazine article        http://www.fawcette.com/javapro/codepage.asp?loccode=jp0208        I have NOT asked for permission to use this.          */     class SortArrowIcon implements Icon {        public static final int NONE = 0;        public static final int DECENDING = 1;        public static final int ASCENDING = 2;        protected int direction;        protected int width = 8;        protected int height = 8;        public SortArrowIcon(int direction) {           this.direction = direction;        }        public int getIconWidth() {           return width;        }        public int getIconHeight() {           return height;        }        public void paintIcon(Component c, Graphics g, int x, int y) {           Color bg = c.getBackground();           Color light = bg.brighter();           Color shade = bg.darker();           int w = width;           int h = height;           int m = w / 2;           if (direction == ASCENDING) {              g.setColor(shade);              g.drawLine(x, y, x + w, y);              g.drawLine(x, y, x + m, y + h);              g.setColor(light);              g.drawLine(x + w, y, x + m, y + h);           }           if (direction == DECENDING) {              g.setColor(shade);              g.drawLine(x + m, y, x, y + h);              g.setColor(light);              g.drawLine(x, y + h, x + w, y + h);              g.drawLine(x + m, y, x + w, y + h);           }        }     }