我有一个非常简单的JTable,我希望按列升序排序。代码非常简单。但它无法正确排序行。我无法弄清楚出了什么问题。以下是我的代码:
package test;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TableSorter {
public static void main(String[] args) {
new TableSorter();
}
public TableSorter() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultTableModel model = new DefaultTableModel(new String[] {"X", "Y", }, 0);
model.addRow(new Object[]{5, 8});
model.addRow(new Object[]{10, 5});
model.addRow(new Object[]{50, 60});
model.addRow(new Object[]{100, 60});
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
Here is the result when I run the program
结果:
X y
10 5
100 60
5 8
50 60
任何帮助将不胜感激。结果附后。 提前谢谢。
答案 0 :(得分:1)
来自DefaultTableModel的文档:
警告:DefaultTableModel返回Object的列类。什么时候 DefaultTableModel与TableRowSorter一起使用,这将导致 广泛使用toString,用于非String数据类型 昂贵。如果你使用DefaultTableModel和TableRowSorter 强烈建议覆盖getColumnClass以返回 适当的类型。
您需要覆盖表模型的getColumnClass,如:
DefaultTableModel model = new DefaultTableModel(new String[] {"X", "Y", }, 0)
{
@Override
public Class<?> getColumnClass(int column)
{
Class<?> returnValue;
if ((column >= 0) && (column < getColumnCount()))
{
returnValue = getValueAt(0, column).getClass();
}
else
{
returnValue = Object.class;
}
return returnValue;
};
};
在你的情况下,它是在整数上比较Integer.toString()
,因此你看到错误的顺序。
通过覆盖getColumnClass()
以返回Integer
类型,您将按其值对整数进行比较。