java – JTable中Date上的无效排序
发布时间:2020-12-14 23:56:53 所属栏目:Java 来源:网络整理
导读:请看下面的代码 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;impo
请看下面的代码
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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- maven下载jar包改用阿里云maven库的方法
- java – 不使用主线程的Fork和Join
- java – availableProcessors()为doublecore手机返回1
- 编写自己的注解处理器小栗子
- Java运算符,用于检查两个条件是否为false,但不是两个条件都
- java – 如何使用onejar Maven插件在清单中设置附加的Class
- java – Solr – 具有默认值的字段如果存储= false则重置自
- java – OkHttp3 SocketTimeoutException(在Android应用程序
- java – Apk扩展文件 – 应用程序许可 – 开发者帐户 – NO
- 需要帮助定义/理解Java EE“堆栈”