Now that we have our columns prepared, we can replace our JList
in part one with a more sophisticated JTable. We simply replace
the EventListModel with an EventTableModel,
which takes our IssueTableFormat in its constructor. We use our
sorted list as the source list for our new EventTableModel, which
shows the issues sorted by event ID.
Although our table will be sorted by event ID, we would like our users to be able to
choose a different sorting criteria by clicking on the column headers. For example,
clicking on the "Type" header should sort our issues by type. Glazed Lists includes a
utility class for just this purpose called TableComparatorChooser.
The TableComparatorChooser is flexible and allows us to specify
zero or more Comparators for each column. As the user clicks on
a column's header, they cycle through the list of Comparators for
that column. You must also specify whether it shall use simple single-column sorting or
more powerful multiple-column sorting. The TableComparatorChooser
automatically includes a Comparator for each column that sorts
using the Comparable interface for that column's value. If your
column's value is not Comparable, you must remove the default
Comparator using
TableComparatorChooser.getComparatorsForColumn(column).clear().
/**
* Display a frame for browsing issues.
*/
public void display() {
SortedList sortedIssues = new SortedList(issuesEventList, new IssueComparator());
// create a panel with a table
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
EventTableModel issuesTableModel = new EventTableModel(sortedIssues, new IssueTableFormat());
JTable issuesJTable = new JTable(issuesTableModel);
TableComparatorChooser tableSorter = new TableComparatorChooser(issuesJTable, sortedIssues, true);
JScrollPane issuesTableScrollPane = new JScrollPane(issuesJTable);
panel.add(issuesTableScrollPane, new GridBagConstraints(...));
// create a frame with that panel
JFrame frame = new JFrame("Issues");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(540, 380);
frame.getContentPane().add(panel);
frame.show();
}