java - numericamente - Ordenar int en JTable
ordenar jtable numericamente (4)
Probablemente no esté agregando elementos de tipo Integer
De lo que puedo ver, la salida se ordena alfabéticamente.
Prueba este:
row.addElement (new Integer (2));
Quiero ordenar una columna con int en ella en una JTable. Yo uso TableRowSorter
con el orden de clasificación SortOrder.ASCENDING
. Pero de alguna manera no ordena como realmente lo quiero.
Lo que quiero:
Lo que consigo:
¿Cuál es el problema? ¿Y cómo puedo solucionarlo?
Aquí está el 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);
}
}
Pruebe esto anular el método getColumnClass en DefaultTableModel:
TableModel model = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) return Integer.class;
return super.getColumnClass(columnIndex);
}
};
Si no anula, JTable trata las primeras columnas como Objeto en lugar de Entero. Ahora, debe ordenar en base a los valores enteros.
Su tabla simplemente no sabe que sus datos contienen números y DefaultTableModel
informa cada tipo de columna como Object
. Pero al final, su uso de DefaultTableModel
no es más simple que implementar su propio modelo de tabla. Simplemente reemplace todo entre //MODEL
y TableModel model = new DefaultTableModel(data, columnNames);
con:
//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;
}
};
Ahora que getColumnClass
informa Integer.class
lugar de Object.class
para su única columna, se ordenará correctamente.
prueba este código
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);
}
}