Совместное использование TableCellRenderer и getColumnClass

когда я добавляю класс getcolumn в свою модель abstracttable, я не могу использовать свой собственный 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();
        }
      }

}

большое спасибо за ваши мнения.


person engtuncay    schedule 29.04.2014    source источник
comment
белого цвета не видел. Это работает.   -  person Braj    schedule 29.04.2014
comment
Почему ваш метод переопределения getColumnClass()?   -  person Braj    schedule 29.04.2014
comment
Пожалуйста, не могли бы вы опубликовать еще немного кода, потому что в приведенном выше коде нет проблем.   -  person Braj    schedule 29.04.2014
comment
я переопределяю getColumnClass, потому что я хочу правильно сортировать и выравнивать числовые столбцы, сортировка числовых столбцов в виде строки дает неверный результат. Благодарность   -  person engtuncay    schedule 29.04.2014


Ответы (2)


Ваш метод getColumnClass() вернет: String.class, Double.class и Integer.class для столбцов 0, 1, 2.

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», это означает, что средство визуализации объектов используется в качестве средства визуализации последней инстанции, только если в таблицу не было добавлено никакого другого пользовательского средства визуализации для определенного класса.

person camickr    schedule 29.04.2014

Используйте 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().

снимок экрана: (выделена одна строка)

введите здесь описание изображения

person Braj    schedule 30.04.2014