Java AbleCellRenderComponent()。和用于格式化日期。您可以为特定列或Date.class的所有实例设置此渲染器

Java AbleCellRenderComponent()。和用于格式化日期。您可以为特定列或Date.class的所有实例设置此渲染器,java,swing,date,jtable,Java,Swing,Date,Jtable,更多信息阅读官方教程我猜您使用的是DefaultTableModel,它使用向量的向量对象的向量。您可能还使用了ResultSet.getString(int列)而不是ResultSet.getDate(int列)。方法返回一个没有时间数据的java.sql.Date对象。您还可以使用最简单的JTable构造函数来使用对象[][] 将更灵活的AbstractTableModel类改为子类 因此,采取以下步骤: 创建一个用Java表示行中数据的类。为数据使用正确的类。不要默认为字符串。对于这里的D

更多信息阅读官方教程

我猜您使用的是
DefaultTableModel
,它使用
向量的
向量
对象的
向量。您可能还使用了
ResultSet.getString(int列)
而不是
ResultSet.getDate(int列)
。方法返回一个没有时间数据的
java.sql.Date
对象。您还可以使用最简单的
JTable
构造函数来使用
对象[][]

将更灵活的
AbstractTableModel
类改为子类

因此,采取以下步骤:

  • 创建一个用Java表示行中数据的类。为数据使用正确的类。不要默认为
    字符串
    。对于这里的
    Date
    ,使用
    java.sql.Date

  • table.setDefaultCellRenderer(Date.class, new DateTableCellRenderer());
    
  • 使用
    ResultSet
    的相应
    getXXX
    方法

  • AbstractTableModel
    扩展到一个新的
    TableModel
    ,它获取新类的
    列表

  • 让新的
    TableModel
    在其
    getColumnClass(int column)
    方法中返回正确的
    Class

  • 正如其他响应者所建议的,如果Swing的默认设置不能满足您的需要,请编写自己的渲染器

  • 替换:

    Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
    getdatecustomer.add(format.format(myDate)); 
    

    编辑:


    我建议你,不要用这种伎俩。这个技巧在将来可能不会有用。请学习如何使用渲染器。并且按照@MadProgrammer的建议,只使用适当的TableCellRenderer

    通过覆盖默认渲染器的setValue()方法创建一个简单的渲染器:

    public class YMDRenderer extends DefaultTableCellRenderer
    {
        private Format formatter = new SimpleDateFormat("yy/MM/dd");
    
        public void setValue(Object value)
        {
            //  Format the Object before setting its value in the renderer
    
            try
            {
                if (value != null)
                    value = formatter.format(value);
            }
            catch(IllegalArgumentException e) {}
    
            super.setValue(value);
        }
    }
    
    要通过使用可重用代码利用这种类型的呈现,请签出。然后,只需指定格式化程序:

    SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd");
    TableCellRenderer renderer = new FormatRenderer( format );
    
    编辑:

    如nachokk所述,如果要创建完全自定义的渲染器,可能需要使用instanceof检查以确保设置了正确的类格式:

    public class YMDRenderer extends DefaultTableCellRenderer
    {
        private Format formatter = new SimpleDateFormat("yy/MM/dd");
    
        public void setValue(Object value)
        {
            //  Format the Object before setting its value in the renderer
    
            if (value instanceof Date)
            {
                value = formatter.format(value);
            }
    
            super.setValue(value);
        }
    }
    

    最好的方法是使用
    TableCellRenderer
    很高兴看到您取得了进展,但编辑使其成为一个完全不同的问题!请回答这个问题,并开始一个与
    ParseException
    相关的新问题。查看
    TableModel
    接口及其
    Class getColumnClass(int column)
    方法。否-不要在模型中存储字符串表示(格式化或非格式化):这是渲染器的任务!我只是给他一个解决问题的窍门。可能他无法处理TableCellRenderer
    可能他无法处理TableCellRenderer
    ——如果人们只是给你一些技巧,而不是解决问题的正确方法,你该如何学习?模型的目的是保存原始的、未格式化的数据。您永远不知道应用程序将来需要如何与这些数据交互。视图的目的是格式化/显示数据,这是决定如何更改数据的地方,在这种情况下,这是
    TableCellRenderer
    的责任。短期黑客总是回来咬你的屁股。空抓?如果发生异常,
    super.setValue
    中的
    value
    的值是多少?@nachokk,则将使用传递到方法中的值,默认渲染器将只使用对象的toString()方法。同意,您通常没有空捕获,但是呈现程序应该显示一些内容,并且类似“无效格式”的消息可能不是合理的值。因此,通过使用空捕捉,您可以获得渲染器的默认行为。+1 mm我知道,这样您就不需要使用
    instanceof
    ,@nachokk是的,您是对的,在本例中,我可以检查Date的实例,因为它是特定渲染器的示例。我展示了FormatRenderer类的基本代码。该类是用于使用任何格式对象的通用类,因此要呈现的值可以是日期、数字、字符串。。。因此,处理IllegalArguementException只是处理任何格式的一般方法。那么唯一需要更改的代码就是格式。
    table.getColumnModel().getColumn(indexOfDateColumn).setCellRenderer(new DateTableCellRenderer());
    
    Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
    getdatecustomer.add(format.format(myDate)); 
    
    getdatecustomer.add(format.format(rs1.getDate(5)));
    
    public class YMDRenderer extends DefaultTableCellRenderer
    {
        private Format formatter = new SimpleDateFormat("yy/MM/dd");
    
        public void setValue(Object value)
        {
            //  Format the Object before setting its value in the renderer
    
            try
            {
                if (value != null)
                    value = formatter.format(value);
            }
            catch(IllegalArgumentException e) {}
    
            super.setValue(value);
        }
    }
    
    SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd");
    TableCellRenderer renderer = new FormatRenderer( format );
    
    public class YMDRenderer extends DefaultTableCellRenderer
    {
        private Format formatter = new SimpleDateFormat("yy/MM/dd");
    
        public void setValue(Object value)
        {
            //  Format the Object before setting its value in the renderer
    
            if (value instanceof Date)
            {
                value = formatter.format(value);
            }
    
            super.setValue(value);
        }
    }