如何更改 JTable 中单元格的背景和格式
How to change background and format of a cell in a JTable
在我的自定义 JTable 中,我有多个列。一列的类型为 java.sql.Timestamp。我想更改所有单元格的背景颜色,我只想更改时间戳单元格的格式。我制作了以下我调用的 customcellrenderer:
for(int i = 0; i < tableTask.getColumnCount(); i++)
{
Class columnClass = myTaskTM.getColumnClass(i);
TableCellRenderer defaultRenderer = tableTask.getDefaultRenderer(columnClass);
tableTask.getColumnModel().getColumn(i).setCellRenderer(new CustomRenderer(defaultRenderer));
}
客户渲染器:
public class CustomRenderer extends DefaultTableCellRenderer
{
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
TableCellRenderer delegate;
public CustomRenderer(TableCellRenderer defaultRenderer)
{
super();
delegate = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color foreground, background;
if(!isSelected)
{
...
}
else
{
background = javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground");
//foreground = javax.swing.UIManager.getDefaults().getColor("Table.selectionForeground");
foreground = Color.BLACK;
}
c.setForeground(foreground);
c.setBackground(background);
setValue(value);
return c;
}
@Override
public void setValue(Object value) {
if (formatter == null) {
formatter = DateFormat.getDateInstance();
}
if(value != null)
{
if(value.getClass().toString().equals("class java.sql.Timestamp"))
{
((JLabel)delegate).setText((value == null) ? "" : formatter.format(value));
}
else
{
((JLabel)delegate).setText(value.toString());
}
}
}
}
setValue 仅在 getTableCellRendererComponent 被注释掉时有效。
我怎样才能让两者都起作用?
setValue()
应该调用delegate.setText()
,因为实际使用了委托的组件。此外,我什至看不到渲染器中调用 setValue()
的位置。
通过 Object value
在渲染器中调用它。
在我的自定义 JTable 中,我有多个列。一列的类型为 java.sql.Timestamp。我想更改所有单元格的背景颜色,我只想更改时间戳单元格的格式。我制作了以下我调用的 customcellrenderer:
for(int i = 0; i < tableTask.getColumnCount(); i++)
{
Class columnClass = myTaskTM.getColumnClass(i);
TableCellRenderer defaultRenderer = tableTask.getDefaultRenderer(columnClass);
tableTask.getColumnModel().getColumn(i).setCellRenderer(new CustomRenderer(defaultRenderer));
}
客户渲染器:
public class CustomRenderer extends DefaultTableCellRenderer
{
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
TableCellRenderer delegate;
public CustomRenderer(TableCellRenderer defaultRenderer)
{
super();
delegate = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color foreground, background;
if(!isSelected)
{
...
}
else
{
background = javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground");
//foreground = javax.swing.UIManager.getDefaults().getColor("Table.selectionForeground");
foreground = Color.BLACK;
}
c.setForeground(foreground);
c.setBackground(background);
setValue(value);
return c;
}
@Override
public void setValue(Object value) {
if (formatter == null) {
formatter = DateFormat.getDateInstance();
}
if(value != null)
{
if(value.getClass().toString().equals("class java.sql.Timestamp"))
{
((JLabel)delegate).setText((value == null) ? "" : formatter.format(value));
}
else
{
((JLabel)delegate).setText(value.toString());
}
}
}
}
setValue 仅在 getTableCellRendererComponent 被注释掉时有效。
我怎样才能让两者都起作用?
setValue()
应该调用delegate.setText()
,因为实际使用了委托的组件。此外,我什至看不到渲染器中调用 setValue()
的位置。
通过 Object value
在渲染器中调用它。