永远不会调用DefaultTableCellRenderer getTableCellRendererComponent

时间:2012-03-23 05:23:23

标签: swing

我需要在JTable中渲染java.util.Date。我已经实现了一个扩展DefaultTableCellRenderer(下面)的自定义渲染器。我已将其设置为列的渲染器,但方法getTableCellRendererComponent()永远不会被调用。

这是一个非常常见的问题,但我见过的解决方案都没有。

public class DateCellRenderer extends DefaultTableCellRenderer {

    String sdfStr = "yyyy-MM-dd HH:mm:ss.SSS";
    SimpleDateFormat sdf = new SimpleDateFormat(sdfStr);

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {


        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (value instanceof Date) {

            this.setText(sdf.format((Date) value));
        }
        else
            logger.info("class: " + value.getClass().getCanonicalName());

        return this;
    }
}

我安装了自定义渲染器(并验证它已安装),如下所示:

DateCellRenderer dcr = new DateCellRenderer();
table.getColumnModel().getColumn(2).setCellRenderer(dcr);

我也试过

table.setDefaultRenderer( java.util.Date.class, dcr );

知道渲染器安装的原因,但从未调用过吗?

5 个答案:

答案 0 :(得分:3)

我用渲染器编写了以下代码,发现没问题。我希望这会有所帮助。

import java.awt.BorderLayout;
import java.awt.Component;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class DateCellRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = 4685939347849124147L;

    String sdfStr = "yyyy-MM-dd HH:mm:ss.SSS";
    SimpleDateFormat sdf = new SimpleDateFormat(sdfStr);

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                row, column);

        if (value instanceof Date) {
            this.setText(sdf.format((Date) value));
        } else {
            System.out.println("class: " + value.getClass().getCanonicalName());
        }

        return this;
    }

    public static void main(String[] args) {
        // Create new Frame
        JFrame frame = new JFrame("Debug Frame");
        frame.setSize(200, 200);
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        DefaultTableModel data = new DefaultTableModel();
        // add one colunb to the data model
        data.addColumn("Testing");
        Vector<Date> dates = new Vector<Date>();
        dates.add(new Date(Calendar.getInstance().getTimeInMillis()));


        data.addRow(dates);
        data.addRow(dates);
        data.addRow(dates);

        JTable table = new JTable(data);
        DateCellRenderer dcr = new DateCellRenderer();
        table.getColumnModel().getColumn(0).setCellRenderer(dcr);

        frame.add(table, BorderLayout.CENTER);
        frame.setVisible(true);
    }
}

答案 1 :(得分:0)

我遇到了同样的问题。我用documention

修复了它
static class DateRenderer extends DefaultTableCellRenderer {
    DateFormat formatter;
    public DateRenderer() { super(); }

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

答案 2 :(得分:0)

我遇到了同样的问题,而问题仅仅是我从网页上复制/粘贴了方法签名。我在开始编码时遇到了这个问题,通常不再这样做,但是这次我没有考虑。自从我来到这里进行搜索以来,我一直想在这里提到它,以寻找为什么它可能发生在我身上。

答案 3 :(得分:-1)

我能够通过修改TableModel中的getValueAt()方法来解决这个问题,以返回格式正确的日期字符串。这不是TableModel的用途,我仍然需要理解为什么安装的自定义渲染不起作用。

答案 4 :(得分:-1)

  1. super.getTableCellRendererComponent返回一个Component,但你没有使用它而没有返回它。
  2. 使用setDefaultRenderer()也为String类设置Rendenrer(也可能用于Object类)
  3. 不是在特定列上设置您的渲染器,而是为整个表设置它,并在您的渲染器代码中检查列号并在那里渲染您的东西。 这应该工作(或谷歌为它: - )