Swing Components Java

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);
          }
       }
    }