Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法按日期对JTable进行排序_Java_Swing_Sorting_User Interface_Jtable - Fatal编程技术网

Java 无法按日期对JTable进行排序

Java 无法按日期对JTable进行排序,java,swing,sorting,user-interface,jtable,Java,Swing,Sorting,User Interface,Jtable,我有一个JTable,其中第一列是日期。但是,这实际上不是一个日期对象,而是一个以英国格式显示日期的字符串。下面是我的代码 private class DisplayAllRevenue extends ComponentAdapter { @Override public void componentShown(ComponentEvent e) { DefaultTableModel model = (

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

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();
             }
         }
     }
如你所见,我正试图按日期对表格进行排序。但不幸的是,它不起作用!一切都出了问题。我想知道这是因为日期实际上是一个字符串

那么,如何根据日期按表正确排序

我想知道这是因为日期实际上是一个字符串

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

整个问题是通过重写方法在表模型实现中检索适当的类。如果我们做得正确,那么JTable组件将能够:

提供适当的渲染器/编辑器。看见 自动创建行分类器,能够按预期对行进行排序。 有关更好的解释,请参见教程的第节。但简而言之:

要确定用于列的比较器,请选择TableRowSorter 尝试依次应用以下每个规则。规则是 按照下列顺序进行操作;提供 使用带比较器的分拣机,忽略剩余规则

如果通过调用setComparator指定了比较器,则使用该比较器。 如果表模型报告列数据由字符串组成,则TableModel.getColumnClass将为此返回String.class 列,使用比较器根据当前值对字符串进行排序 场所 如果TableModel.getColumnClass返回的column类实现Comparable,请使用比较器对基于 在Comparable.compareTo返回的值上。 如果通过调用setStringConverter为表指定了字符串转换器,请使用对结果字符串进行排序的比较器 基于当前区域设置的表示。 如果前面的规则都不适用,请使用比较器对列数据调用toString,并根据 当前区域设置。 因为Date类实现了可比较的接口,所以这是第3点的一个例子。因此,再次正确重写getColumnClass将引导您解决问题

离题 请注意,数据库调用是一项耗时的任务,可能会阻塞数据库,导致GUI无响应。EDT是一个单一且特殊的 必须在其中执行Swing组件创建和更新以及事件处理的线程

话虽如此,请看一下代码中的这一部分:

private class DisplayAllRevenue extends ComponentAdapter {
     @Override
     public void componentShown(ComponentEvent e) {
         // Event handling code: it is performed in the EDT
     }
}
如果每次显示组件时都进行数据库调用,则会出现严重的性能问题。您可以考虑添加一个按钮,让用户刷新表的数据,而不是在显示组件时自动尝试。

此外,为了避免阻塞EDT,您可以考虑使用A来执行后台线程中的数据库调用,并更新EDT中的Swing组件。更多信息请参阅

我想知道这是因为日期实际上是一个字符串

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

整个问题是通过重写方法在表模型实现中检索适当的类。如果我们做得正确,那么JTable组件将能够:

提供适当的渲染器/编辑器。看见 自动创建行分类器,能够按预期对行进行排序。 有关更好的解释,请参见教程的第节。但简而言之:

要确定用于列的比较器,请选择TableRowSorter 尝试依次应用以下每个规则。规则是 按照下列顺序进行操作;提供 使用带比较器的分拣机,忽略剩余规则

如果通过调用setComparator指定了比较器,则使用该比较器。 如果表模型报告列数据由字符串组成,则TableModel.getColumnClass将为此返回String.class 列,使用比较器根据当前值对字符串进行排序 场所 如果TableModel.getColumnClass返回的column类实现Comparable,请使用比较器对基于 在Comparable.compareTo返回的值上。 如果为表b指定了字符串转换器 通过调用setStringConverter,使用比较器对结果字符串进行排序 基于当前区域设置的表示。 如果前面的规则都不适用,请使用比较器对列数据调用toString,并根据 当前区域设置。 因为Date类实现了可比较的接口,所以这是第3点的一个例子。因此,再次正确重写getColumnClass将引导您解决问题

离题 请注意,数据库调用是一项耗时的任务,可能会阻塞数据库,导致GUI无响应。EDT是一个单一且特殊的 必须在其中执行Swing组件创建和更新以及事件处理的线程

话虽如此,请看一下代码中的这一部分:

private class DisplayAllRevenue extends ComponentAdapter {
     @Override
     public void componentShown(ComponentEvent e) {
         // Event handling code: it is performed in the EDT
     }
}
如果每次显示组件时都进行数据库调用,则会出现严重的性能问题。您可以考虑添加一个按钮,让用户刷新表的数据,而不是在显示组件时自动尝试。

此外,为了避免阻塞EDT,您可以考虑使用A来执行后台线程中的数据库调用,并更新EDT中的Swing组件。有关更多信息,请参阅。

要更快获得更好的帮助,请发布一个最小的完整可验证示例。硬编码一些数据以替换数据库。@AndrewThompson:我正在使用Netbeans GUI生成器。因此,发布自动生成的代码将是一团混乱!祝你好运。投票关闭。将日期字符串解析为日期对象,或者最好从数据库中将其作为日期对象读取。把这些放在你的桌子上,然后分类就可以了。如果日期的外观看起来不合适,请创建一个单元格渲染器来自定义它。@stefan:这就是我不知道如何做的。为了更快地获得更好的帮助,请发布一个最小的完整的可验证示例。硬编码一些数据以替换数据库。@AndrewThompson:我正在使用Netbeans GUI生成器。因此,发布自动生成的代码将是一团混乱!祝你好运。投票关闭。将日期字符串解析为日期对象,或者最好从数据库中将其作为日期对象读取。把这些放在你的桌子上,然后分类就可以了。如果日期的外观不合适,请创建一个单元格渲染器来自定义它。@stefan:我不知道该怎么做。我发现这是正确的方法。我试过了,但遇到了一些问题。即使我有问题,因为这个答案是正确的,我也会将它标记为已解决。请看一下我的新问题-我发现这是正确的方法。我试过了,但遇到了一些问题。即使我有问题,因为这个答案是正确的,我也会将它标记为已解决。请看一下我的新问题-