为什么此表将所有条目排序为字符串?

时间:2013-03-12 10:24:49

标签: java swing sorting jtable

我遇到的问题是我用自己填充数据并希望使用接口自动分类的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);
        }

1 个答案:

答案 0 :(得分:2)

来自JTable的javadoc; setAutoCreateRowSorter创建TableRowSorter的实例,并从它的javadoc排序工作如下

  1. 如果Comparator方法已为列指定了setComparator,请使用它。
  2. 如果getColumnClass返回的列类为String,请使用Comparator返回的Collator.getInstance()
  3. 如果列类实现Comparable,请使用调用Comparator方法的compareTo
  4. 如果指定了TableStringConverter,请使用它将值转换为String,然后使用Comparator返回的Collator.getInstance()
  5. 否则,请使用Comparator返回的Collator.getInstance()在对象上调用toString的结果。
  6. 因此,如果您想更改默认值(本例中为5),则需要

    1. 设置Comparator
    2. 在数据对象中实现Comparable<SomeCommonInterface>
    3. 设置TableStringConverter以实现自定义toString功能
    4. 或者,您可以跳过所有这些并使用自己的自定义排序逻辑实现自定义RowSorter

      修改

      根据OP的评论,IntegerString混合在一起。

      没有明显的方法可以将IntegerString进行比较,因此您需要决定规则,我会假设该规则是“字符串前的数字”。

      现在,要么将所有数据包装在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());
          }
      }