Java JTable分拣机不工作
我有一个非常简单的JTable,我想按列0升序排序。代码非常简单。但它无法对行进行正确排序。我想不出哪里出了问题。以下是我的代码:Java JTable分拣机不工作,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,我有一个非常简单的JTable,我想按列0升序排序。代码非常简单。但它无法对行进行正确排序。我想不出哪里出了问题。以下是我的代码: 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;
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);
}
});
}
}
任何帮助都将不胜感激。结果见附件。
提前感谢。来自以下文档:
警告:DefaultTableModel返回对象的列类。什么时候
DefaultTableModel与TableRowSorter一起使用,这将导致
toString的广泛使用,这对于非字符串数据类型是
昂贵的。如果将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;
};
};
DefaultTableModel=new DefaultTableModel(新字符串[]{“X”,“Y”,“0”)
{
@凌驾
公共类getColumnClass(int列)
{
阶级价值;
如果((列>=0)和(&(列
在您的例子中,它正在比较整数的Integer.toString()
,因此您看到的顺序是错误的。
通过重写
getColumnClass()
以返回Integer
类型,您将获得整数的值比较。该图像最好粘贴为文本。行排序器将数字排序为字符串。将列声明为typeInteger
&这应该可以解决问题。
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;
};
};