JTable单元格渲染

时间:2010-12-16 17:43:26

标签: rendering timestamp jtable

我正在获取数据库的数据并显示在表格中。

我的getColumnClass是

@Override
public Class<? extends Object> getColumnClass(int column) {
    return getValueAt(0, column).getClass();
}

当我打印值时,我得到类名为java.sql.Timestamp,但是当它显示我有问题时,它只显示dd / MM / yyyy,但我需要它来显示dd / MM / yyyy HH:mm,我怎么能实现这个目标?

除此之外,我需要检查数据时间是否小于今天,然后禁用行

2 个答案:

答案 0 :(得分:3)

我知道这是一个非常古老的问题,但我遇到了一个非常类似的问题,并决定为这个问题发布一个更好的解决方案。

首先,您应该定义一个新类:TimestampCellRenderer.java

package gui;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.table.DefaultTableCellRenderer;

public class TimestampCellRenderer extends DefaultTableCellRenderer {

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    public TimestampCellRenderer() {
        super();
    }

    public void setValue(Object value) {
        if (formatter == null) {
            formatter = DateFormat.getDateInstance();
        }
        setText((value == null) ? "" : formatter.format(value));
    }
}

然后在您的GUI类中,将此定义添加到您的类中:

yourTable.getColumnModel().getColumn(1).setCellRenderer(new TimestampCellRenderer());

在这种情况下,我决定格式化第一列,但在表模型中定义常量是一个非常好的做法。

最好的部分是您可以将代码重用于使用Timestamp数据类型的其他表。

希望这有帮助!

答案 1 :(得分:1)

我找到了一个解决方案,这里是

@Override
        public Class<? extends Object> getColumnClass(int column) {
            String value = getValueAt(0, column).getClass().toString();

            if (value.equalsIgnoreCase("class java.sql.Timestamp")) {
                return JTextField.class;
            }

            return getValueAt(0, column).getClass();
        }

有更好的方法吗?