不希望时间在JTable上

时间:2014-01-04 04:07:25

标签: java swing date jtable

当我从数据库中获取数据时,它会将Date作为04/01/2014 00:00:00,并显示在JTable上。

现在我想在桌子上只显示日期并丢弃时间。

我该怎么做?

编辑:

public Vector getDateCustomer(String name,String name1)throws Exception
{
Vector<Vector<String>> getdatecustomerVector = new Vector<Vector<String>>();

Connection conn = dbConnection();

pre1=conn.prepareStatement("select * from Debit where Date "
    + "between CDate(?) and CDate(?) order by Date ASC");
pre1.setString(1, name); // bind param 1
pre1.setString(2, name1); // bind param 2

ResultSet rs1 = pre1.executeQuery();
while(rs1.next())
{
Vector<String> getdatecustomer = new Vector<String>();
getdatecustomer.add(rs1.getString(1)); 
getdatecustomer.add(rs1.getString(2)); 
getdatecustomer.add(rs1.getString(3)); 
getdatecustomer.add(rs1.getString(4)); 
Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
getdatecustomer.add(format.format(myDate)); 
getdatecustomer.add(rs1.getString(6)); 
getdatecustomerVector.add(getdatecustomer);
}
/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();

return getdatecustomerVector;
}

这就是我从数据库中获取值的方法。

获取错误

java.text.ParseException: Unparseable date: "2014-01-01"
    at java.text.DateFormat.parse(DateFormat.java:357)
    at shop.DBEngine.getDateCustomer(DBEngine.java:548)
    at shop.DCSTable.<init>(DCSTable.java:127)
    at shop.DCS.actionPerformed(DCS.java:273)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2713)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:680)
    at java.awt.EventQueue$4.run(EventQueue.java:678)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

6 个答案:

答案 0 :(得分:5)

基于原始问题

你可以做两件事。

  1. 确保表模型返回给定列的Date.classJTable的默认行为是获取对象toString结果并将其显示在单元格内。
  2. 如果您不能这样做或者结果不符合您的要求,您应该自己创建一个自定义表格单元格渲染器,它可以返回您想要的格式...
  3. 例如

    public class DateTableCellRenderer extends DefaultTableCellRenderer {
    
        protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
        private DateFormat format;
    
        public DateTableCellRenderer() {
            this(DATE_FORMAT);
        }
    
        public DateTableCellRenderer(DateFormat format) {
            this.format = format;
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Date) {
                value = format.format((Date)value);
            }
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            return this;
        }
    
    }
    

    请查看How to use tables,特别是Using Custom Renderers了解更多详情

    应用此渲染器的最佳方法可能是将其设置为特定类类型的默认渲染,在此java.util.Date中,或者如果您知道它是java.sql.Date

    table.setDefaultCellRenderer(Date.class, new DateTableCellRenderer());
    

    这将假设TableModel的{​​{1}}正在返回列的正确类类型。如果没有,那么您需要将渲染器直接设置为特定列...

    getColumnClass

    就个人而言,我更喜欢第二种选择......

    基于更新的问题

    不要更改来自数据库的数据类型,这些数据类型很重要,您实际上可能希望以某种超出table.getColumnModel().getColumn(indexOfDateColumn).setCellRenderer(new DateTableCellRenderer()); 功能的方式与它们进行交互。

    模型的目的是表示数据,模型不应该关注数据呈现的格式,事实上,您可以越多地保持数据的原始格式越好。

    视图负责决定如何表示数据,在这种情况下,这是String

    的作用

答案 1 :(得分:4)

然后你应该使用SimpleDateFormat。例如:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String s = format.format(yourDate);

答案 2 :(得分:4)

您可以实施自己的TableCellRenderer,可以扩展DefaultTableCellRenderer创建自定义DateCellRenderer覆盖getTableCellRendererComponent()。要格式化日期,请使用SimpleFormatDate。您可以为特定列或Date.class的所有实例设置此渲染器。

更多信息请阅读官方教程Using Custom Renderers

答案 3 :(得分:2)

通过覆盖默认渲染器的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);
    }
}

通过使用可重复使用的代码检查Table Format Renderers来利用此类渲染。然后你需要做的就是指定格式化程序:

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);
    }
}

答案 4 :(得分:0)

我猜您使用的是DefaultTableModelVector使用了VectorObject的{​​{1}}秒。您也可能使用ResultSet.getString(int column)而不是ResultSet.getDate(int column)getDate方法返回java.sql.Date对象,该对象没有时间数据。您可能还使用Object[][]使用最简单的JTable构造函数。

代替更灵活的AbstractTableModel类。

所以,请采取以下步骤:

  1. 创建一个用Java表示行中数据的类。使用正确的数据类。不要默认为String。对于此处的Date,请使用java.sql.Date

  2. 使用getXXX的相应ResultSet方法。

  3. AbstractTableModel扩展为新TableModelList新班级。

  4. 让您的新TableModel在其Class<?>方法中返回正确的getColumnClass(int column)

  5. 正如其他响应者所建议的那样,如果Swing的默认设置不能为您提供服务,请编写自己的渲染器。

答案 5 :(得分:0)

替换:

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

通过

getdatecustomer.add(format.format(rs1.getDate(5)));

编辑:

我建议你,不要使用这种技巧。这个技巧在将来可能没用。请了解如何使用渲染器。并且只使用正确的TableCellRenderer,因为@MadProgrammer建议你。