Java – invalid sort on date in JTable
•
Java
Look at the code below
import java.awt.*; import java.awt.event.*; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.table.*; public class TableBasic extends JFrame { public TableBasic() { String[] columnNames = {"Date","String","Long","Boolean"}; Object[][] data = { {getJavaDate("13-11-2020"),"A",new Long(1),Boolean.TRUE },{getJavaDate("13-11-2018"),"B",new Long(2),Boolean.FALSE},{getJavaDate("12-11-2015"),"C",new Long(9),"D",new Long(4),Boolean.FALSE} }; final JTable table = new JTable(data,columnNames); table.setPreferredScrollableViewportSize(table.getPreferredSize()); table.setAutoCreateRowSorter(true); table.getColumnModel().getColumn(0).setCellRenderer(tableCellRenderer); // DefaultRowSorter has the sort() method DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter()); ArrayList list = new ArrayList(); list.add( new RowSorter.sortKey(0,SortOrder.DESCENDING) ); sorter.setSortKeys(list); sorter.sort(); JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); } private TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() { SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy"); public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) { if( value instanceof Date) { value = f.format(value); } return super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); } }; private Date getJavaDate(String s) { try { SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); Date d = sdf.parse(s); return d; } catch (ParseException ex) { Logger.getLogger(TableBasic.class.getName()).log(Level.SEVERE,null,ex); return null; } } public static void main(String[] args) { TableBasic frame = new TableBasic(); frame.setDefaultCloSEOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } }
Now try sorting them using the date field It is sorted in an invalid way! Here are the results!
Why did this happen? I even used cell rendering!
Solution
@Sciper is not an answer, but I can't resist it, because your code is very complex, the design is wrong, and you miss the required lightweight
The missing key element is to override tablemodel Getcolumnclass (), which is critical to the table sorting function
import java.awt.*; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.table.*; public class TableBasic { private JFrame frame = new JFrame(); private String[] columnNames = {"Date","Boolean"}; private Object[][] data = { {getJavaDate("13-11-2020"),new Double(1),Boolean.TRUE},new Double(2),new Double(9),new Double(4),Boolean.FALSE} }; private DefaultTableModel model = new DefaultTableModel(data,columnNames) { @Override public Class<?> getColumnClass(int column) { return getValueAt(0,column).getClass(); } }; private JTable table = new JTable(model); private JScrollPane scrollPane = new JScrollPane(table); private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy"); public TableBasic() { table.setPreferredScrollableViewportSize(table.getPreferredSize()); table.setAutoCreateRowSorter(true); setRenderers(); // DefaultRowSorter has the sort() method table.getRowSorter().toggleSortOrder(0); frame.add(scrollPane); frame.setDefaultCloSEOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } private void setRenderers() { //TableColumnModel m = table.getColumnModel(); //"Integer","Interger","Double","Boolean","Date" table.setDefaultRenderer(Date.class,new DateRenderer()); } private Date getJavaDate(String s) { try { SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); Date d = sdf.parse(s); return d; } catch (ParseException ex) { Logger.getLogger(TableBasic.class.getName()).log(Level.SEVERE,ex); return null; } } public static void main(String[] args) { EventQueue.invokelater(new Runnable() { @Override public void run() { TableBasic frame = new TableBasic(); } }); } private class DateRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table,int column) { super.getTableCellRendererComponent(table,column); if (!(value instanceof Date)) { return this; } setText(DATE_FORMAT.format((Date) value)); return this; } } }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码