在 JTable 中对 int 进行排序
Sort int in JTable
我想在 JTable 中对包含 int 的列进行排序。我使用 TableRowSorter
和排序顺序 SortOrder.ASCENDING
。但不知何故,它并不是我真正想要的那样。
我想要的:
我得到的:
问题是什么?我该如何解决?
这是 SSCCE:
ResultGUI.java
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;
public class ResultGUI {
protected static JTable ranglisteTable = new JTable();
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 368, 316);
frame.setLayout(null);
//MODEL
Vector<Object> data = new Vector<Object>();
Vector<Object> row = new Vector<Object>();
row.addElement(3);
data.addElement(row);
Vector<Object> row2 = new Vector<Object>();
row2.addElement(2);
data.addElement(row2);
Vector<Object> row3 = new Vector<Object>();
row3.addElement(1);
data.addElement(row3);
Vector<Object> row4 = new Vector<Object>();
row4.addElement(22);
data.addElement(row4);
Vector<Object> row5 = new Vector<Object>();
row5.addElement(13);
data.addElement(row5);
Vector<String> columnNames = new Vector<String>();
columnNames.addElement("Points");
TableModel model = new DefaultTableModel(data, columnNames);
for(int i = 0; i < 10; i++){
ranglisteTable.setRowHeight(i, 30);
}
ranglisteTable.setBounds(109, 0, 128, 277);
ranglisteTable.setModel(model);
//SORTING
TableRowSorter<TableModel> sorter = new TableRowSorter<>(ranglisteTable.getModel());
ranglisteTable.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
sorter.sort();
frame.add(ranglisteTable);
frame.setVisible(true);
}
}
你试试这个代码
import java.util.ArrayList;
import java.util.Date;
import javax.swing.DefaultRowSorter;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
public class ResultGUI extends JFrame
{
public ResultGUI()
{
String[] columnNames = {"points"};
Object[][] data =
{{ new Long(1)}, { new Long(2)},{ new Long(9) },{ new Long(4)}
};
final JTable table = new JTable(data, columnNames)
{
public Class getColumnClass(int column)
{
// Lookup first non-null data on column
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
return o.getClass();
}
return Object.class;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setAutoCreateRowSorter(true);
// DefaultRowSorter has the sort() method
DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter());
ArrayList list = new ArrayList();
list.add( new RowSorter.SortKey(0, SortOrder.ASCENDING) );
sorter.setSortKeys(list);
sorter.sort();
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
}
public static void main(String[] args)
{
ResultGUI frame = new ResultGUI();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}
您的 table 根本不知道您的数据包含数字,并且 DefaultTableModel
将每个列类型报告为 Object
。但最终,您对 DefaultTableModel
的使用并不比实现您自己的 table 模型简单。只需将 //MODEL
和 TableModel model = new DefaultTableModel(data, columnNames);
之间的所有内容替换为:
//MODEL
final int[] data={ 3, 2, 1, 22, 13, };
TableModel model = new AbstractTableModel() {
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return 1;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex!=0) throw new IndexOutOfBoundsException();
return data[rowIndex];
}
public String getColumnName(int column) {
if(column!=0) throw new IndexOutOfBoundsException();
return "Points";
}
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}
};
现在 getColumnClass
为您的唯一列报告 Integer.class
而不是 Object.class
,它将正确排序。
尝试覆盖 DefaultTableModel 中的 getColumnClass 方法:
TableModel model = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) return Integer.class;
return super.getColumnClass(columnIndex);
}
};
如果不覆盖,JTable 会将第一列视为对象而不是整数。现在,它应该根据整数值排序。
我想在 JTable 中对包含 int 的列进行排序。我使用 TableRowSorter
和排序顺序 SortOrder.ASCENDING
。但不知何故,它并不是我真正想要的那样。
我想要的:
我得到的:
问题是什么?我该如何解决?
这是 SSCCE:
ResultGUI.java
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;
public class ResultGUI {
protected static JTable ranglisteTable = new JTable();
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 368, 316);
frame.setLayout(null);
//MODEL
Vector<Object> data = new Vector<Object>();
Vector<Object> row = new Vector<Object>();
row.addElement(3);
data.addElement(row);
Vector<Object> row2 = new Vector<Object>();
row2.addElement(2);
data.addElement(row2);
Vector<Object> row3 = new Vector<Object>();
row3.addElement(1);
data.addElement(row3);
Vector<Object> row4 = new Vector<Object>();
row4.addElement(22);
data.addElement(row4);
Vector<Object> row5 = new Vector<Object>();
row5.addElement(13);
data.addElement(row5);
Vector<String> columnNames = new Vector<String>();
columnNames.addElement("Points");
TableModel model = new DefaultTableModel(data, columnNames);
for(int i = 0; i < 10; i++){
ranglisteTable.setRowHeight(i, 30);
}
ranglisteTable.setBounds(109, 0, 128, 277);
ranglisteTable.setModel(model);
//SORTING
TableRowSorter<TableModel> sorter = new TableRowSorter<>(ranglisteTable.getModel());
ranglisteTable.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
sorter.sort();
frame.add(ranglisteTable);
frame.setVisible(true);
}
}
你试试这个代码
import java.util.ArrayList;
import java.util.Date;
import javax.swing.DefaultRowSorter;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
public class ResultGUI extends JFrame
{
public ResultGUI()
{
String[] columnNames = {"points"};
Object[][] data =
{{ new Long(1)}, { new Long(2)},{ new Long(9) },{ new Long(4)}
};
final JTable table = new JTable(data, columnNames)
{
public Class getColumnClass(int column)
{
// Lookup first non-null data on column
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
return o.getClass();
}
return Object.class;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setAutoCreateRowSorter(true);
// DefaultRowSorter has the sort() method
DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter());
ArrayList list = new ArrayList();
list.add( new RowSorter.SortKey(0, SortOrder.ASCENDING) );
sorter.setSortKeys(list);
sorter.sort();
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
}
public static void main(String[] args)
{
ResultGUI frame = new ResultGUI();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}
您的 table 根本不知道您的数据包含数字,并且 DefaultTableModel
将每个列类型报告为 Object
。但最终,您对 DefaultTableModel
的使用并不比实现您自己的 table 模型简单。只需将 //MODEL
和 TableModel model = new DefaultTableModel(data, columnNames);
之间的所有内容替换为:
//MODEL
final int[] data={ 3, 2, 1, 22, 13, };
TableModel model = new AbstractTableModel() {
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return 1;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex!=0) throw new IndexOutOfBoundsException();
return data[rowIndex];
}
public String getColumnName(int column) {
if(column!=0) throw new IndexOutOfBoundsException();
return "Points";
}
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}
};
现在 getColumnClass
为您的唯一列报告 Integer.class
而不是 Object.class
,它将正确排序。
尝试覆盖 DefaultTableModel 中的 getColumnClass 方法:
TableModel model = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) return Integer.class;
return super.getColumnClass(columnIndex);
}
};
如果不覆盖,JTable 会将第一列视为对象而不是整数。现在,它应该根据整数值排序。