当我将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();
}
}
}非常感谢您的意见。
发布于 2014-04-30 04:58:34
对于第0、1、2列,getColumnClass()方法将返回: 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“时,这意味着仅当特定类的其他自定义渲染器尚未添加到表中时,才使用对象渲染器作为最后的渲染器。
发布于 2014-04-30 11:47:33
使用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()。
截图:(选择一行)

https://stackoverflow.com/questions/23369527
复制相似问题