请看下面的代码
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); } }
现在,尝试使用Date字段对其进行排序.它以无效的方式排序!以下是结果!
为什么会这样发生?我甚至用过细胞渲染!
解决方法
@Sciper不是一个回答,但我无法抗拒,因为你的代码非常复杂,设计错误,错过了需要的轻量级…
缺少的关键元素是覆盖TableModel.getColumnClass(),这对于表排序功能至关重要
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; } } }