DefaultTableCellRenderer getTableCellRendererComponent 永远不会被调用 [英] DefaultTableCellRenderer getTableCellRendererComponent never gets called

查看:34
本文介绍了DefaultTableCellRenderer getTableCellRendererComponent 永远不会被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在 JTable 中呈现一个 java.util.Date.我已经实现了一个扩展 DefaultTableCellRenderer 的自定义渲染器(代码如下).我已将其设置为列的渲染器,但从未调用方法 getTableCellRendererComponent().

I need to render a java.util.Date in a JTable. I've implemented a custom renderer that extends DefaultTableCellRenderer (code appears below). I've set it as the renderer for the column, but the method getTableCellRendererComponent() never gets called.

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

This is a pretty common problem, but none of the solutions I've seen work.

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

我已经像这样安装了自定义渲染器(并验证它已安装):

I've installed the custom renderer (and verified that it has been installed) like this:

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

我也试过

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

知道为什么安装了渲染器,但从未调用过吗?

Any idea why the renderer gets installed, but never called?

推荐答案

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

I wrote the following code with your renderer and found no problem. I hope this helps.

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

这篇关于DefaultTableCellRenderer getTableCellRendererComponent 永远不会被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆