0

自分でデータを入力したJTableが、インターフェイスを使用して自動ソートしたいという問題があります。ただし、文字列として並べ替えられるため、2の後に10が続きます。どうすれば修正できますか?

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; javadocのソートのインスタンスを作成し、そこから次のように機能しsetAutoCreateRowSorterますTableRowSorter

  1. メソッドComparatorによって列にaが指定されている場合は、それを使用します。setComparator
  2. によって返される列クラスがである場合は、によって返されるgetColumnClassを使用しStringます。ComparatorCollator.getInstance()
  3. 列クラスがを実装する場合は、メソッドを呼び出すComparableを使用します。ComparatorcompareTo
  4. aが指定されている場合は、それを使用して値をsTableStringConverterに変換してから、によって返されたを使用します。StringComparatorCollator.getInstance()
  5. それ以外の場合は、オブジェクトを呼び出した結果でComparator返されたを使用します。Collator.getInstance()toString

したがって、デフォルト(この場合は5)を変更する場合は、次のいずれかを行う必要があります。

  1. を設定しますComparator
  2. Comparable<SomeCommonInterface>データオブジェクト内のImplemenetまたは
  3. TableStringConverterカスタムtoString機能を実装するように設定します

または、それをすべてスキップしてRowSorter、独自のカスタム並べ替えロジックを使用してカスタムを実装することもできます。

編集

OPのコメントから、との混合配列がIntegerありStringます。

Integeraとaを比較する明確な方法がない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());
    }
}
于 2013-03-12T10:36:32.137 に答える