DefaultTableCellRenderer getTableCellRendererComponent 永远不会被调用 [英] DefaultTableCellRenderer getTableCellRendererComponent never gets called
问题描述
我需要在 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屋!