如果Override" getColumnClass"如何对JTable行进行排序没有效果

时间:2017-08-15 14:28:15

标签: java swing sorting jtable tablerowsorter

事实上,它更像是一个答案,而不是一个问题。 从文件创建JTable时,我遇到了TableRowSorter的问题。我像这样使用TableModel:

public class TModel extends AbstractTableModel {

    public Vector data;
    public Vector colNames;
    public String datafile;
    Class[] types = {Integer.class, Date.class, Number.class, String.class, Character.class};

    public TModel(String f) {
        datafile = f;
        initVectors();
    }

    public void initVectors() {
        String aLine;
        data = new Vector();
        colNames = new Vector();
        try {
            FileInputStream fin = new FileInputStream(datafile);
            BufferedReader br = new BufferedReader(new InputStreamReader(fin));
            // extract column names
            StringTokenizer st1 =
                    new StringTokenizer(br.readLine(), "|");
            while (st1.hasMoreTokens())
                colNames.addElement(st1.nextToken());
            // extract data
            while ((aLine = br.readLine()) != null) {
                StringTokenizer st2 =
                        new StringTokenizer(aLine, "|");
                while (st2.hasMoreTokens())
                    data.addElement(st2.nextToken());
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int getRowCount() {
        return data.size() / getColumnCount();
    }

    public int getColumnCount() {
        return colNames.size();
    }

    public String getColumnName(int columnIndex) {
        String colName = "";

        if (columnIndex <= getColumnCount())
            colName = (String) colNames.elementAt(columnIndex);

        return colName;
    }

    public Class getColumnClass(int columnIndex) {
        return this.types[columnIndex];
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return data.elementAt((rowIndex * getColumnCount()) + columnIndex);
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        return;
    }

问题是表中的第一列按字符串排序,无论它从哪个类型返回&#34; GetColumnClass&#34;方法。针对此类问题的最常见建议是:&#34;您应该覆盖您的GetColumnClass方法&#34;或者&#34;为每一列设置特定类型&#34; ...遗憾的是,这些都不适用于我:_(This topic帮助了我很多,主要是来自Alanmars的片段。 简单的说法:如果TableRowSorter像String一样处理数字,那就让它像Integer一样比较它们! 下面 - 片段,对我有用:

TModel tModel = new TModel(selectedFile);
JTable table = new JTable();
JScrollPane scrollPane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sorter = new TableRowSorter<>(tModel);
sorter.setComparator(IndexOfDesiredColumn, new Comparator<String>() {
    @Override
    public int compare(String n1, String n2) {
    return Integer.parseInt(n1) - Integer.parseInt(n2);
    }
});
table.setModel(tModel);
table.setRowSorter(sorter);

希望这个步骤能为那些与我面临同样问题的人节省时间。

1 个答案:

答案 0 :(得分:-2)

所有列都从原始Vector获取数据,这些数据都在Object ...

分拣机会接收Objectnull,而不是toString(),并在其上调用getColumnClass(),然后对结果进行排序......

你的NullPointerException方法没有正确实现,好像模型中没有数据(EG为空)它将抛出 for(var x in [0,1,2]) {console.log('js');} for(const y in [0,1,2]) {console.log('js');} ......