【问题标题】:How can I sort a table by displayed value rather than internal value?如何按显示值而不是内部值对表格进行排序?
【发布时间】:2015-06-23 01:28:03
【问题描述】:

我使用ETable 在标准 JTable 上添加了一些功能。

我面临的问题是在单击列标题时正确排序表格。目前,我有一个日期字段以原始(双精度)格式显示修改后的儒略日期(MJD)。在内部,它是一个 MJD 对象(看起来像一个日期字符串)。对表进行排序时,以默认方式(字典排序)处理该列,从而产生一个类似1.0, 10.0, 100.0, 101.0, ... 的列表。如果我显示 MJD 对象而不是 double 形式,则它是正确排序的;但是,我需要将其显示为双精度。 如何强制根据显示的内容进行比较和排序?

请注意,我已经查看了此处发布的几个类似问题,例如 Java JTable Sorting Doesn't Work for Just One Column。这种类型的解决方案对我不起作用,因为我不能简单地为该列返回一个双类,因为它在内部是不同的对象类型。

【问题讨论】:

  • 这些结构中的大多数应该允许您提供自己的Comparator,因此您可以定义自己如何比较这些字符串,即将它们转换为双精度然后再转换等。
  • @Thomas 我对 java 还很陌生,我已经看到了 Comparator 的例子,但我不确定把它放在哪里? MJD 类已经覆盖了compareTo,以便我们可以比较实际的 MJD 对象。
  • 那么在这种情况下,您的列数据类型应该是MJD。 AFAIK 该表使用RowSorter(通过table.setRowSorter(...) 设置),默认为TableRowSorter 的实例,它应该在分类实现Comparable 上正确工作。除此之外,您还可以尝试获取RowSorter 并致电setComparator(index, comparator)

标签: java swing jtable tablerowsorter


【解决方案1】:

JTable tutorial 中所示,您可以在您的表格或特定列上设置TableRowSorterDefaultRowSorter#setComparator 在您的情况下很有趣:您可以为所有列重新使用默认行排序器,只需为该特定列指定自定义 Comparator

当然,如果你的表模型中的对象已经实现了Comparable,就不需要自己设置Comparator。只需确保 TableModel#getColumnClass 返回正确的类即可。

【讨论】:

  • 来自DefaultRowSorter "如果你指定一个 Comparator 将其参数转换为模型提供的类型以外的类型,则在对数据进行排序时将引发 ClassCastException。"这是我的问题的一部分。该模型需要 MJD 类型,但我想比较双打。 getColumnClass 返回一个 MJD 类,由于同样的原因,不能将其更改为 double。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多