Java 使用对象设置AutoCreateRowSorter

Java 使用对象设置AutoCreateRowSorter,java,swing,jtable,comparable,defaulttablemodel,Java,Swing,Jtable,Comparable,Defaulttablemodel,我有一个包含3列的JTable。每一列都有自己的格式,表格如下所示: 问题是(如您所见)排序不正确(setAutoCreateRowSorter) 我试图为col3定义自己的对象类型,该对象实现了Comparable,并且还为此对象定义了一个toString()方法。但这似乎无助于我正确地进行排序 知道我做错了什么吗 public class SortJTable { public static void main(String[] args) { String[]

我有一个包含3列的
JTable
。每一列都有自己的格式,表格如下所示:

问题是(如您所见)排序不正确(
setAutoCreateRowSorter

我试图为
col3
定义自己的对象类型,该对象
实现了Comparable
,并且还为此对象定义了一个
toString()
方法。但这似乎无助于我正确地进行排序

知道我做错了什么吗

public class SortJTable {

    public static void main(String[] args) {
        String[] columns = getTableColumns();
        Object[][] tableData = getTableValues();
        TableModel model = new DefaultTableModel(tableData, columns) {

            @Override
            public Class getColumnClass(int col) {
                if (col == 2) // third column is a TablePercentValue
                    return TablePercentValue.class;
                else
                    return String.class;
            }
        };

        JTable table = new JTable(model);
        table.setAutoCreateRowSorter(true); // Make it possible to column-sort

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    private static String[] getTableColumns(){
        String[] columns = new String[3];
        columns[0] = "col1";
        columns[1] = "col2";
        columns[2] = "col3";
        return columns;
    }

    private static Object[][] getTableValues(){
        Object[][] tableData = new Object[100][3];
        for(int i=0; i<tableData.length; i++){
            for(int j=0; j<tableData[0].length; j++){
                String value;
                if(j==2)
                    value = i+","+j+"%";
                else if(j == 1)
                    value = i+":"+j;
                else
                    value = i+""+j;
                tableData[i][j] = value;
            }
        }
        return tableData;
    }
}

class TablePercentValue implements Comparable<TablePercentValue> {

    private String value;
    private double compValue;

    public TablePercentValue(String value){
        this.value = value;
        // Remove "%"-sign and convert to double value
        compValue = Double.parseDouble(value.replace("%", ""));
    }

    public String toString(){
        return value;
    }

    @Override
    public int compareTo(TablePercentValue o) {
        return compValue>o.compValue ? 1 : -1;
    }
}
公共类排序表{
公共静态void main(字符串[]args){
String[]columns=getTableColumns();
对象[][]tableData=getTableValues();
TableModel模型=新的DefaultTableModel(tableData,列){
@凌驾
公共类getColumnClass(int-col){
if(col==2)//第三列是TablePercentValue
返回TablePercentValue.class;
其他的
返回字符串.class;
}
};
JTable table=新的JTable(模型);
table.setAutoCreateRowSorter(true);//使列排序成为可能
JFrame=新JFrame();
frame.add(新的JScrollPane(表));
frame.pack();
frame.setVisible(true);
}
私有静态字符串[]getTableColumns(){
字符串[]列=新字符串[3];
列[0]=“col1”;
列[1]=“col2”;
列[2]=“col3”;
返回列;
}
私有静态对象[][]getTableValues(){
Object[][]tableData=新对象[100][3];

对于(int i=0;i您被重写的
getColumnClass
存在错误:第二列不是
TablePercentValue
类型,它仍然是一个
字符串。就您的示例而言,可以在填充数据的地方修复此问题:

for(int j=0; j<tableData[0].length; j++){
    if(j==2)
        tableData[i][j] = new TablePercentValue(i+","+j+"%");
    else if(j == 1)
        tableData[i][j] = i+":"+j;
    else
        tableData[i][j] = i+""+j;
    tableData[i][j] = value;
}

但这可能只是一个本地化问题,对您来说运行良好。

啊!我的手上有一个错误。您说得太对了。非常感谢!现在似乎可以了:)
compValue = Double.parseDouble(value.replace("%", "").replace(",", "."));