Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable+;排序特定字段_Java_Swing_Sorting_Jtable - Fatal编程技术网

Java JTable+;排序特定字段

Java JTable+;排序特定字段,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,我有一个JTable并添加了排序。现在,JTable有5列,日期字段中的第2列转换为DD/MM/YYYY,并显示在单元格中的JTextField中 当我将其排序为字符串,并且日期混淆时,如何更改该特定列的排序行为 按ASC顺序排序后,我得到: 01/02/2012 01/03/2011 01/04/2011 01/05/2011 01/06/2011 01/07/2011 01/08/2011 01/09/2011 01/10/2011 01/12/2011 这是错误的,我应该得到这样的结果

我有一个JTable并添加了排序。现在,JTable有5列,日期字段中的第2列转换为DD/MM/YYYY,并显示在单元格中的JTextField中

当我将其排序为字符串,并且日期混淆时,如何更改该特定列的排序行为

按ASC顺序排序后,我得到:

01/02/2012
01/03/2011
01/04/2011
01/05/2011
01/06/2011
01/07/2011
01/08/2011
01/09/2011
01/10/2011
01/12/2011
这是错误的,我应该得到这样的结果

01/03/2011
01/04/2011
01/05/2011
01/06/2011
01/07/2011
01/08/2011
01/09/2011
01/10/2011
01/12/2011
01/02/2012
我的代码现在看起来像这样进行排序

List<SortKey> sortKeys = new ArrayList<SortKey>();
sortKeys.add(new SortKey(2, SortOrder.ASCENDING));
table.getRowSorter().setSortKeys(sortKeys);
List sortKeys=new ArrayList();
添加(新的SortKey(2,SortOrder.升序));
table.getRowSorter().setSortKeys(sortKeys);

对于该特定列,我应该只更改什么?

您需要实现将日期字符串视为
date
相当简单的
string
的comparator,请看一看,因为
java.util.date
实现了
Comparable
,对于第二列,让您的
TableModel
getColumnClass()
返回
Date.class
就足够了。使用a可根据需要设置日期格式

附录:下面是一个使用
setDefaultRenderer()
的示例

import java.awt.*;
导入java.text.DateFormat;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入javax.swing.*;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
/**@见http://stackoverflow.com/questions/4553448 */
公共类TableDate扩展了JPanel{
私有静态final int_COL=0;
私有静态最终整数日期\u COL=1;
私有最终日历=Calendar.getInstance();
私有最终CustomModel模型=新CustomModel();
专用最终JTable表=新JTable(模型);
公共表格日期(){
超级(新网格布局(1,0));
表.setAutoCreateRowSorter(真);
table.setDefaultRenderer(Date.class,new DateRenderer());
table.setPreferredScrollableViewportSize(新维度(320240));
JScrollPane sp=新的JScrollPane(表);
添加(sp);

对于(int i=1;我感谢快速链接,当我尝试将其呈现为日期时,我在线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中得到一个异常“exception”:无法将给定对象格式化为日期”,如何解决此问题?不,仅将其呈现为字符串,但在comparator中,从字符串创建日期,然后将gerColumnClass与第二列进行比较,如果我返回Date.class,则在线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中会出现以下错误异常:无法在java.text.DateFormat.format处将给定对象格式化为日期javax.swing.JTable$DateRenderer.setValue(未知源代码)javax.swing.table.DefaultTableCellRenderer.GetTableCellRenderComponent(未知源代码)的java.text.Format.Format(未知源代码)
import java.awt.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

/** @see http://stackoverflow.com/questions/4553448 */
public class TableDate extends JPanel {

    private static final int INT_COL = 0;
    private static final int DATE_COL = 1;
    private final Calendar calendar = Calendar.getInstance();
    private final CustomModel model = new CustomModel();
    private final JTable table = new JTable(model);

    public TableDate() {
        super(new GridLayout(1, 0));
        table.setAutoCreateRowSorter(true);
        table.setDefaultRenderer(Date.class, new DateRenderer());
        table.setPreferredScrollableViewportSize(new Dimension(320, 240));
        JScrollPane sp = new JScrollPane(table);
        this.add(sp);
        for (int i = 1; i <= 20; i++) {
            model.addRow(newRow(i));
        }
    }

    private Object[] newRow(int i) {
        calendar.add(Calendar.DAY_OF_YEAR, 1);
        return new Object[]{Integer.valueOf(i), calendar.getTime()};
    }

    private static class CustomModel extends DefaultTableModel {

        private final String[] columnNames = {"Index", "Date"};

        @Override
        public Class<?> getColumnClass(int col) {
            if (col == INT_COL) {
                return Integer.class;
            } else if (col == DATE_COL) {
                return Date.class;
            }
            return super.getColumnClass(col);
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }
    }

    private static class DateRenderer extends DefaultTableCellRenderer {

        DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

        public DateRenderer() {
            super();
        }

        @Override
        public void setValue(Object value) {
            setText((value == null) ? "" : formatter.format(value));
        }
    }

    private void display() {
        JFrame f = new JFrame("TableDate");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TableDate().display();
            }
        });
    }
}