0

I have the problem that the JTable that I fill myself with data and want to autosort it using the interface. However it gets sorted as Strings, so 10 comes after 2. How can i fix that?

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);
        }
4

1 回答 1

2

来自 javadocs 的JTable; setAutoCreateRowSorter创建实例及其 javadoc 排序的TableRowSorter工作方式如下

  1. 如果方法Comparator已为列指定了a setComparator,则使用它。
  2. 如果返回的列类getColumnClassString,则使用Comparator返回的Collator.getInstance()
  3. 如果列类实现Comparable,请使用Comparator调用该compareTo方法的 。
  4. 如果TableStringConverter已指定 a,则使用它将值转换为Strings,然后使用Comparator返回的 by Collator.getInstance()
  5. 否则,在调用对象的结果上使用Comparator返回的 by 。Collator.getInstance()toString

因此,如果您想更改默认值(在本例中为 5),您需要

  1. 设置一个Comparator
  2. Comparable<SomeCommonInterface>在您的数据对象中实施或
  3. 设置一个TableStringConverter来实现自定义toString功能

或者,您可以跳过所有这些并RowSorter使用您自己的自定义排序逻辑实现自定义。

编辑

从 OP 的评论中可以看出Integer和的混合数组String

没有明显的方法可以将 aInteger与 a进行比较,String因此您需要确定一个规则,我将假设该规则是“字符串前的数字”。

现在,要么将所有数据包装在实现Comparableon的类中Object并在那里完成工作,要么实现 a 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());
    }
}
于 2013-03-12T10:36:32.137 回答