一起使用 TableCellRenderer 和 getColumnClass
Posted
技术标签:
【中文标题】一起使用 TableCellRenderer 和 getColumnClass【英文标题】:Using TableCellRenderer and getColumnClass together 【发布时间】:2014-06-15 16:16:36 【问题描述】:当我将 getcolumn 类添加到我的 abstracttablemodel 时,我无法使用我的自定义 TableCellRenderer 来设置背景颜色。 (我用它来排序,对齐数字列)
public Class getColumnClass(int columnIndex)
Object o = getValueAt(0, columnIndex);
if (o == null)
return Object.class;
else
return o.getClass();
这全是我的代码。
import java.awt.*;
import java.text.DecimalFormat;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.table.*;
public class DemoRenderer extends JFrame
public static void main( String[] args )
DemoRenderer frame = new DemoRenderer();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible( true );
public DemoRenderer()
JTable table = new JTable();
table.setModel(new MyTablemodel());
table.setDefaultRenderer(Object.class, new MyCustomTableCellRenderer());
// Tell the table what to use to render our column of doubles
table.repaint();
//table.getColumnModel().getColumn(1).setCellRenderer(new DecimalFormatRenderer() );
getContentPane().add(new JScrollPane(table));
/**
Here is our class to handle the formatting of the double values
*/
class MyCustomTableCellRenderer extends DefaultTableCellRenderer
private static final DecimalFormat formatter = new DecimalFormat( "#0.00" );
public Component getTableCellRendererComponent (JTable table,
Object obj, boolean isSelected, boolean hasFocus, int row, int column)
if(column==1) obj = formatter.format((Number)obj);
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column);
if (isSelected)
cell.setBackground(Color.green);
else
if (row % 2 == 0)
cell.setBackground(Color.cyan);
else
cell.setBackground(Color.lightGray);
return cell;
class MyTablemodel extends AbstractTableModel
Object[] columnNames = "A", "B", "C" ;
Object[][] data =
"1abc", new Double(850.503), 53 ,
"2def", new Double(36.23254), 6 ,
"3ghi", new Double( 8.3 ), 7 ,
"4jkl", new Double( 246.0943 ), 23 ;
@Override
public int getRowCount()
return data.length;
@Override
public int getColumnCount()
return columnNames.length;
@Override
public Object getValueAt(int rowIndex, int columnIndex)
return data[rowIndex][columnIndex];
public Class getColumnClass(int columnIndex)
Object o = getValueAt(0, columnIndex);
if (o == null)
return Object.class;
else
return o.getClass();
非常感谢您的意见。
【问题讨论】:
我没见过白色。它的工作。 为什么要覆盖getColumnClass()
方法?
请您再发布一些代码,因为上面的代码没有问题。
我覆盖 getColumnClass 因为我想正确排序和对齐数字列,将数字列排序为字符串会提供错误的结果。谢谢
【参考方案1】:
您的 getColumnClass() 方法将返回:第 0、1、2 列的 String.class、Double.class 和 Integer.class。
JTable 将为 Double 和 Integer 列提供默认渲染器。
如果您想为所有列使用自定义渲染器,那么您需要这样做:
MyCustomTableCellRenderer renderer = new MyCustomTableCellRenderer();
table.setDefaultRenderer(Object.class, renderer); // or you could use "String.class"
table.setDefaultRenderer(Double.class, renderer);
table.setDefaultRenderer(Integer.class, renderer);
当您使用“Object.class”时,这意味着将 Object 渲染器用作最后的渲染器,前提是没有将特定类的其他自定义渲染器添加到表中。
【讨论】:
【参考方案2】:使用TableColumn#setCellRenderer() 为每列绘制单独的值。
只需在代码中添加以下行
MyCustomTableCellRenderer cellRenderer = new MyCustomTableCellRenderer();
for (int i = 0; i < table.getColumnCount(); i++)
table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
而不是
table.setDefaultRenderer(Object.class, new MyCustomTableCellRenderer());
你的问题就解决了。
注意:您使用的DefaultTableCellRenderer
将应用于单元格,因此使用setCellRenderer()
而不是setDefaultRenderer()
。
截图:(选中一行)
【讨论】:
以上是关于一起使用 TableCellRenderer 和 getColumnClass的主要内容,如果未能解决你的问题,请参考以下文章
使用复杂的 TableCellRenderer 在 JTable 中格式化来自 JDBC 的数据