The EventTableModel and TableComparatorChooser

With your columns prepared, replace the JList with a JTable. This means exchanging the EventListModel with an EventTableModel, which requires your IssueTableFormat for its constructor. The SortedList is the data source for the EventTableModel.

Although it's initially sorted by priority, your users will want to reorder the table by clicking on the column headers. For example, clicking on the "Type" header shall sort the issues by type. For this, Glazed Lists provides TableComparatorChooser, which adds sorting to a JTable using your SortedList.

  /**
   * 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();
  }

Note

TableComparatorChooser supports both single column sorting (simpler) and multiple column sorting (more powerful). This is configured by the third argument in the constructor.

Warning

By default, TableComparatorChooser sorts by casting column values to Comparable. If your column's values are not Comparable, you'll have to manually remove the default Comparator using TableComparatorChooser.getComparatorsForColumn(column).clear().