Swing DefaultTableCellRenderer GetTableCellRenderComponent从未被调用

Swing DefaultTableCellRenderer GetTableCellRenderComponent从未被调用,swing,Swing,我需要在JTable中呈现java.util.Date。我已经实现了一个自定义渲染器,它扩展了DefaultTableCellRenderer(代码显示在下面)。我已将其设置为列的呈现器,但从未调用方法getTableCellRenderComponent() 这是一个非常常见的问题,但我所看到的解决方案都不起作用 public class DateCellRenderer extends DefaultTableCellRenderer { String sdfStr = "yyyy

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

这是一个非常常见的问题,但我所看到的解决方案都不起作用

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

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

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

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

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

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);
    }
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.Vector;
导入javax.swing.JFrame;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
公共类DateCellRenderer扩展了DefaultTableCellRenderer{
私有静态最终长serialVersionUID=46859347849124147L;
字符串sdfStr=“yyyy-MM-dd-HH:MM:ss.SSS”;
SimpleDataFormat sdf=新的SimpleDataFormat(sdfStr);
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
super.getTableCellRenderComponent(表、值、isSelected、hasFocus、,
行、列);
if(值instanceof Date){
此.setText(sdf.format((日期)值));
}否则{
System.out.println(“类:”+value.getClass().getCanonicalName());
}
归还这个;
}
公共静态void main(字符串[]args){
//创建新框架
JFrame frame=新JFrame(“调试帧”);
框架。设置尺寸(200200);
frame.setLayout(新的BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel数据=新的DefaultTableModel();
//向数据模型添加一个colunb
数据。添加列(“测试”);
向量日期=新向量();
添加(新日期(Calendar.getInstance().getTimeInMillis());
数据。添加行(日期);
数据。添加行(日期);
数据。添加行(日期);
JTable table=新的JTable(数据);
DateCellRenderer dcr=新的DateCellRenderer();
table.getColumnModel().getColumn(0).setCellRenderer(dcr);
添加(表格、边框布局、中心);
frame.setVisible(true);
}
}

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

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);
    }
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.Vector;
导入javax.swing.JFrame;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
公共类DateCellRenderer扩展了DefaultTableCellRenderer{
私有静态最终长serialVersionUID=46859347849124147L;
字符串sdfStr=“yyyy-MM-dd-HH:MM:ss.SSS”;
SimpleDataFormat sdf=新的SimpleDataFormat(sdfStr);
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
super.getTableCellRenderComponent(表、值、isSelected、hasFocus、,
行、列);
if(值instanceof Date){
此.setText(sdf.format((日期)值));
}否则{
System.out.println(“类:”+value.getClass().getCanonicalName());
}
归还这个;
}
公共静态void main(字符串[]args){
//创建新框架
JFrame frame=新JFrame(“调试帧”);
框架。设置尺寸(200200);
frame.setLayout(新的BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel数据=新的DefaultTableModel();
//向数据模型添加一个colunb
数据。添加列(“测试”);
向量日期=新向量();
添加(新日期(Calendar.getInstance().getTimeInMillis());
数据。添加行(日期);
数据。添加行(日期);
数据。添加行(日期);
JTable table=新的JTable(数据);
DateCellRenderer dcr=新的DateCellRenderer();
table.getColumnModel().getColumn(0).setCellRenderer(dcr);
添加(表格、边框布局、中心);
frame.setVisible(true);
}
}
  • GetTableCellRenderComponent返回一个组件,但您没有使用它,也没有返回它
  • 使用setDefaultRenderer()为String类(也可能为Object类)设置渲染器
  • 不要在特定列上设置渲染器,而是为整个表设置渲染器,并检入渲染器编码列号,然后在那里渲染您的内容。 这应该行得通(或者用谷歌搜索:-)
  • GetTableCellRenderComponent返回一个组件,但您没有使用它,也没有返回它
  • 使用setDefaultRenderer()为String类(也可能为Object类)设置渲染器
  • 不要在特定列上设置渲染器,而是为整个表设置渲染器,并检入渲染器编码列号,然后在那里渲染您的内容。 这应该行得通(或者用谷歌搜索:-)