PlayerTable.java Source code

Java tutorial

Introduction

Here is the source code for PlayerTable.java

Source

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