我有一个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
。
那么,我怎样才能按表"正确排序"根据日期?
答案 0 :(得分:3)
我想知道这个,因为Date实际上是一个字符串。
是的,很有可能。请注意,您不必将表模型中包含的数据与其表示混合。在这种情况下,您可以完美地拥有一个Date
对象,并以英国格式或您喜欢的任何格式显示它。更好的是,对于国际化交易,您可以让表格单元格渲染器/编辑器解析当前区域设置并相应地应用日期格式。
整个问题是通过重写getColumnClass(columnIndex)方法来检索表模型实现中的相应类。如果我们正确执行此操作,则JTable
组件将能够:
有关更好的说明,请参阅Sorting and Filtering教程的How to Use Tables部分。但简而言之:
要确定哪个
Comparator
用于列,TableRowSorter
尝试依次应用以下每个规则。规则是 按照下面列出的顺序;提供的第一条规则 使用Comparator
的分拣机,忽略了剩余规则。
- 如果通过调用
setComparator
指定了比较器,请使用该比较器。- 如果表模型报告列数据由字符串组成(T
ableModel.getColumnClass
返回String.class
列),使用比较器根据当前对字符串进行排序 区域设置。- 如果
TableModel.getColumnClass
返回的列类实现Comparable
,请使用比较器对字符串进行排序 关于Comparable.compareTo
返回的值。- 如果通过调用
setStringConverter
为表指定了字符串转换器,请使用比较器对结果字符串进行排序 基于当前语言环境的表示。- 如果以前的规则都不适用,请使用比较器调用列数据上的
醇>toString
并根据结果对结果字符串进行排序 当前的语言环境。
由于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。
中的详情