SWT Jface Eclipse Java

//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
import java.util.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
/**
 * This program displays a table of baseball players and allows sorting by first
 * name, last name, or lifetime batting average.
 */
public class PlayerTable {
  private PlayerComparator comparator;
  // Must fully-qualify List to avoid ambiguity with
  // org.eclipse.swt.widgets.List
  private java.util.List players;
  /**
   * Constructs a PlayerTable
   */
  public PlayerTable() {
    // Create the comparator used for sorting
    comparator = new PlayerComparator();
    comparator.setColumn(PlayerComparator.FIRST_NAME);
    comparator.setDirection(PlayerComparator.ASCENDING);
    // Create the players
    players = new ArrayList();
    players.add(new Player("Gil", "Hodges", 0.273f));
    players.add(new Player("Jim", "Gilliam", 0.265f));
    players.add(new Player("Jackie", "Robinson", 0.311f));
    players.add(new Player("Pee Wee", "Reese", 0.269f));
    players.add(new Player("Roy", "Campanella", 0.276f));
    players.add(new Player("Carl", "Furillo", 0.299f));
    players.add(new Player("Sandy", "Amoros", 0.255f));
    players.add(new Player("Duke", "Snider", 0.295f));
  }
  /**
   * Runs the application
   */
  public void run() {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Player Table");
    createContents(shell);
    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }
  /**
   * Create the contents of the main window
   * 
   * @param composite the parent composite
   */
  private void createContents(Composite composite) {
    composite.setLayout(new FillLayout());
    // Create the table
    final Table table = new Table(composite, SWT.NONE);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    // Create each of the columns, adding an event
    // listener that will set the appropriate fields
    // into the comparator and then call the fillTable
    // helper method
    TableColumn[] columns = new TableColumn[3];
    columns[0] = new TableColumn(table, SWT.NONE);
    columns[0].setText("First Name");
    columns[0].addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        comparator.setColumn(PlayerComparator.FIRST_NAME);
        comparator.reverseDirection();
        fillTable(table);
      }
    });
    columns[1] = new TableColumn(table, SWT.NONE);
    columns[1].setText("Last Name");
    columns[1].addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        comparator.setColumn(PlayerComparator.LAST_NAME);
        comparator.reverseDirection();
        fillTable(table);
      }
    });
    columns[2] = new TableColumn(table, SWT.RIGHT);
    columns[2].setText("Batting Average");
    columns[2].addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        comparator.setColumn(PlayerComparator.BATTING_AVERAGE);
        comparator.reverseDirection();
        fillTable(table);
      }
    });
    // Do the initial fill of the table
    fillTable(table);
    // Pack each column so inital display is good
    for (int i = 0, n = columns.length; i < n; i++) {
      columns[i].pack();
    }
  }
  private void fillTable(Table table) {
    // Turn off drawing to avoid flicker
    table.setRedraw(false);
    // We remove all the table entries, sort our
    // rows, then add the entries
    table.removeAll();
    Collections.sort(players, comparator);
    for (Iterator itr = players.iterator(); itr.hasNext();) {
      Player player = (Player) itr.next();
      TableItem item = new TableItem(table, SWT.NONE);
      int c = 0;
      item.setText(c++, player.getFirstName());
      item.setText(c++, player.getLastName());
      item.setText(c++, String.valueOf(player.getBattingAverage()));
    }
    // Turn drawing back on
    table.setRedraw(true);
  }
  /**
   * The application's entry point
   * 
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    new PlayerTable().run();
  }
}
//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
/**
 * This class represents a player.
 */
 class Player {
  private String firstName;
  private String lastName;
  private float battingAverage;
  /**
   * Constructs a Player
   * 
   * @param firstName the first name
   * @param lastName the last name
   * @param battingAverage the batting average
   */
  public Player(String firstName, String lastName, float battingAverage) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.battingAverage = battingAverage;
  }
  /**
   * Gets the batting average
   * 
   * @return float
   */
  public float getBattingAverage() {
    return battingAverage;
  }
  /**
   * Gets the first name
   * 
   * @return String
   */
  public String getFirstName() {
    return firstName;
  }
  /**
   * Gets the last name
   * 
   * @return String
   */
  public String getLastName() {
    return lastName;
  }
}
//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
/**
 * This class does the comparisons for sorting Player objects.
 */
class PlayerComparator implements Comparator {
  /** Constant for First Name column */
  public static final int FIRST_NAME = 0;
  /** Constant for Last Name column */
  public static final int LAST_NAME = 1;
  /** Constant for Batting Average column */
  public static final int BATTING_AVERAGE = 2;
  /** Constant for ascending */
  public static final int ASCENDING = 0;
  /** Constant for descending */
  public static final int DESCENDING = 1;
  private int column;
  private int direction;
  /**
   * Compares two Player objects
   * 
   * @param obj1 the first Player
   * @param obj2 the second Player
   * @return int
   * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
   */
  public int compare(Object obj1, Object obj2) {
    int rc = 0;
    Player p1 = (Player) obj1;
    Player p2 = (Player) obj2;
    // Determine which field to sort on, then sort
    // on that field
    switch (column) {
    case FIRST_NAME:
      rc = p1.getFirstName().compareTo(p2.getFirstName());
      break;
    case LAST_NAME:
      rc = p1.getLastName().compareTo(p2.getLastName());
      break;
    case BATTING_AVERAGE:
      rc = (p1.getBattingAverage() < p2.getBattingAverage()) ? -1 : 1;
      break;
    }
    // Check the direction for sort and flip the sign
    // if appropriate
    if (direction == DESCENDING) {
      rc = -rc;
    }
    return rc;
  }
  /**
   * Sets the column for sorting
   * 
   * @param column the column
   */
  public void setColumn(int column) {
    this.column = column;
  }
  /**
   * Sets the direction for sorting
   * 
   * @param direction the direction
   */
  public void setDirection(int direction) {
    this.direction = direction;
  }
  /**
   * Reverses the direction
   */
  public void reverseDirection() {
    direction = 1 - direction;
  }
}