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 Comparator
s for each column. As the user clicks on
a column's header, they cycle through the list of Comparator
s 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(); }