【问题标题】:Using TableCellRenderer and getColumnClass together一起使用 TableCellRenderer 和 getColumnClass
【发布时间】: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 因为我想正确排序和对齐数字列,将数字列排序为字符串会提供错误的结果。谢谢

标签: java swing jtable tablecellrenderer abstracttablemodel


【解决方案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()

    截图:(选中一行)

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 2023-03-22
      • 2011-11-09
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2017-01-02
      • 1970-01-01
      相关资源
      最近更新 更多