无法按日期对JTable进行排序

时间:2014-11-13 12:03:17

标签: java swing sorting user-interface jtable

我有一个JTable,其中第一列是Date。但是,这实际上不是Date对象,它是String,以英国格式显示日期。以下是我的代码

private class DisplayAllRevenue extends ComponentAdapter
     {
         @Override
         public void componentShown(ComponentEvent e)
         {
             DefaultTableModel model = (DefaultTableModel) allRevenueTable.getModel();
             model.setRowCount(0);


             dbConnector = new DBHandler();
             dbConnector.makeConnection();

             java.sql.Date dateOfLastUpdate=null;


             ResultSet portfolioRs = dbConnector.selectAllDetails(getPortfolioData);

             try
             {
                 if(portfolioRs.isBeforeFirst()==false)
                 {
                     JOptionPane.showMessageDialog(null,"Empty");
                 }
                 else
                 {
                     while(portfolioRs.next())
                     {
                         String provider = portfolioRs.getString("Provider Name");
                         String client = portfolioRs.getString("Client Name");
                         int idPortfolio = portfolioRs.getInt("idPortfolio");
                         dateOfLastUpdate = portfolioRs.getDate("Update_Date");


                         String dateOfLastUpdateS = getDateInUKFormat(convertSQLDateToJavaDate(dateOfLastUpdate));

                         Object[]row3 = {dateOfLastUpdateS, provider, client, idPortfolio};

                         model.addRow(row3);
                         }

                     }

                    //Sort the Table
                    DefaultRowSorter sorter = ((DefaultRowSorter)allRevenueTable.getRowSorter()); 
                    ArrayList list = new ArrayList();
                    list.add( new RowSorter.SortKey(0, SortOrder.DESCENDING) );
                    sorter.setSortKeys(list);
                    sorter.sort();
                 }
             }
             catch(SQLException sql)
             {
                 JOptionPane.showMessageDialog(null,"Error displaying data");
                 sql.printStackTrace();
             }
             finally
             {
                 dbConnector.closeConnection();
             }
         }
     }

如您所见,我正在尝试按Date对表格进行排序。但不幸的是,它没有工作!一切都失灵了。我想知道这是因为Date实际上是String

那么,我怎样才能按表"正确排序"根据日期?

1 个答案:

答案 0 :(得分:3)

  

我想知道这个,因为Date实际上是一个字符串。

是的,很有可能。请注意,您不必将表模型中包含的数据与其表示混合。在这种情况下,您可以完美地拥有一个Date对象,并以英国格式或您喜欢的任何格式显示它。更好的是,对于国际化交易,您可以让表格单元格渲染器/编辑器解析当前区域设置并相应地应用日期格式。

整个问题是通过重写getColumnClass(columnIndex)方法来检索表模型实现中的相应类。如果我们正确执行此操作,则JTable组件将能够:

有关更好的说明,请参阅Sorting and Filtering教程的How to Use Tables部分。但简而言之:

  

要确定哪个Comparator用于列,TableRowSorter   尝试依次应用以下每个规则。规则是   按照下面列出的顺序;提供的第一条规则   使用Comparator的分拣机,忽略了剩余规则。

     
      
  1. 如果通过调用setComparator指定了比较器,请使用该比较器。
  2.   
  3. 如果表模型报告列数据由字符串组成(T ableModel.getColumnClass返回String.class   列),使用比较器根据当前对字符串进行排序   区域设置。
  4.   
  5. 如果TableModel.getColumnClass返回的列类实现Comparable,请使用比较器对字符串进行排序   关于Comparable.compareTo返回的值。
  6.   
  7. 如果通过调用setStringConverter为表指定了字符串转换器,请使用比较器对结果字符串进行排序   基于当前语言环境的表示。
  8.   
  9. 如果以前的规则都不适用,请使用比较器调用列数据上的toString并根据结果对结果字符串进行排序   当前的语言环境。
  10.   

由于Date类实现了Comparable接口,因此它是第3点的情况。因此,再一次正确覆盖getColumnClass()将导致您解决问题。< / p>


题外话

请注意,数据库调用是一项耗时的任务,可能会阻止Event Dispatch Thread (EDT)导致GUI无响应。 EDT是一个单一和特殊的 必须执行Swing组件创建和更新并执行事件处理的线程。

话虽如此,请在代码中查看此部分:

private class DisplayAllRevenue extends ComponentAdapter {
     @Override
     public void componentShown(ComponentEvent e) {
         // Event handling code: it is performed in the EDT
     }
}

如果每次显示组件时都进行数据库调用,那么您将遇到严重的性能问题。您可以考虑添加一个按钮,让用户刷新表格的数据,而不是在显示组件时自动尝试这样做。

此外,为了避免阻止EDT,您可以考虑使用SwingWorker在后台线程中执行数据库调用并更新EDT中的Swing组件。请参阅Concurrency in Swing trail

中的详情