A table of baseball players and allows sorting
//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; } }