我遇到的问题是我用自己填充数据并希望使用接口自动分类的JTable。然而,它被排序为字符串,所以10在2之后。我如何解决这个问题?
public class GUI extends Frame implements ActionListener, WindowListener {
private static final long serialVersionUID = -693036000167528691L;
private Button run,findAll,sortByNumberOfStretchesFound, sortByLongestStretch;
private TextField selectionSizeStart, numberOfThreads, selectionSizeEnd, minimumStretchSize, sequence;
private JTable table;
private String[] columnNames = new String[]{"#","Label","Label-Length","#Stretches Found","Unique","Longest Stretch"};
private int sortBy = 3;
private Object[][] data;
public GUI(String defaultSequence, int defaultSelectionMinimumSize, int defaultNumberOfThreads) {
table = new JTable(new DefaultTableModel(columnNames,0));
table.setAutoCreateRowSorter(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scrollbar = new JScrollPane(table);
setLayout(new FlowLayout());
setVisible(true);
}
答案 0 :(得分:2)
来自JTable
的javadoc; setAutoCreateRowSorter
创建TableRowSorter
的实例,并从它的javadoc排序工作如下
Comparator
方法已为列指定了setComparator
,请使用它。 getColumnClass
返回的列类为String
,请使用Comparator
返回的Collator.getInstance()
。 Comparable
,请使用调用Comparator
方法的compareTo
。 TableStringConverter
,请使用它将值转换为String
,然后使用Comparator
返回的Collator.getInstance()
。 Comparator
返回的Collator.getInstance()
在对象上调用toString
的结果。 因此,如果您想更改默认值(本例中为5),则需要
Comparator
,Comparable<SomeCommonInterface>
或TableStringConverter
以实现自定义toString
功能或者,您可以跳过所有这些并使用自己的自定义排序逻辑实现自定义RowSorter
。
修改强>
根据OP的评论,Integer
和String
混合在一起。
没有明显的方法可以将Integer
与String
进行比较,因此您需要决定规则,我会假设该规则是“字符串前的数字”。
现在,要么将所有数据包装在Comparable
上实现Object
的类中,并在那里完成工作或实现Comparator<Object>
,请将其设置在表中。在比较方法中,您需要使用instaceof
来计算您要比较的内容并进行比较。该方法需要看起来像:
class MyClass implements Comparator<Object> {
public int compare(Object o1, Object o2) {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null) {
return 1;
}
if (o2 == null) {
return -1;
}
if (o1 instanceof Integer && o2 instanceof String) {
return 1;
}
if (o1 instanceof String && o2 instanceof Integer) {
return -1;
}
if (o1 instanceof Integer && o2 instanceof Integer) {
return ((Integer) o1).compareTo((Integer) o2);
}
return o1.toString().compareTo(o2.toString());
}
}