ordenar numericamente modificar insertar hacer filtro filtrar despues datos como columnas busqueda boton actualizar java swing jtable tablerowsorter

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); } }