DefaultTableCellRenderer não chama na primeira coluna

Estou com um baita problema.
Estou sobrescrevendo o metodo getTableCellRendererComponent do DefaultTableCellRenderer para pintar linhas e colunas de uma jTable, porém ele nunca executa isso na primeira coluna, mesmo trocando elas de ordem. Nas demais está funcionando 100%.

Segue abaixo o código.

DefaultTableCellRenderer meuRender = new DefaultTableCellRenderer() {

        @Override
        public Component getTableCellRendererComponent(
                JTable table, Object value, boolean isSelected, boolean hasFocus, int r, int c) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, r, c);
            if (r == 0) {
                System.out.println(r + " " + c);
            }
            try {
                setBackground(corFundo.get(r).get(c));
                setForeground(corFonte.get(r).get(c));
                // setSelectionBackground(corFundoSelec.get(r).get(c));
                // setSelectionForeground(corFonteSelec.get(r).get(c));
            } catch (Exception ex) {
                ex.printStackTrace();
                setBackground(padraoFundo);
                setForeground(padraoFonte);
                // setSelectionBackground(padraoFundoSelec);
                // setSelectionForeground(padraoFonteSelec);
            }
            return this;
        }
    };

E como aplico ele na minha tabela

setDefaultRenderer(Object.class, meuRender);

Coloquei um if para a primeira linha somente pois minha tabela de testes contém várias linhas.
e ele sempre imprime:
0 1
0 2
0 3
0 4
ou seja nunca entra na coluna 0.

Alguém tem alguma dica? Estou a algumas horas quebrando a cabeça por causa disso.

[quote]Edit:
Verifiquei que ao selecionar uma linha ou várias, só a primeira coluna fica destacada.[/quote]

O seu TableModel está retornando Object.class na primeira coluna?

Pode postar o TableModel que você está usando?

Se não está deveria, não sobrescrevi o TabelModel padrão do jTable.

Para facilitar vou postar todo o código. hehehe

Só não reparem na POG :stuck_out_tongue_winking_eye:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package minhalib;

import java.awt.Color;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.util.ArrayList;
import java.util.regex.PatternSyntaxException;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.*;

/**
 *
 * @author Augusto Wolf
 */
public class MinhaTabela extends JTable {

    ArrayList<ArrayList<Color>> corFundo = new ArrayList<>();
    Color padraoFundo = Color.WHITE;
    ArrayList<ArrayList<Color>> corFonte = new ArrayList<>();
    Color padraoFonte = Color.BLACK;
    ArrayList<ArrayList<Color>> corFundoSelec = new ArrayList<>();
    Color padraoFundoSelec = new Color(60, 120, 250);
    ArrayList<ArrayList<Color>> corFonteSelec = new ArrayList<>();
    Color padraoFonteSelec = Color.BLACK;
    ArrayList<Class> types = new ArrayList<>();
    boolean padraoEdit = true;
    ArrayList<ArrayList<Boolean>> canEdit = new ArrayList<>();
    
    DefaultTableCellRenderer meuRender = new DefaultTableCellRenderer() {

        @Override
        public Component getTableCellRendererComponent(
                JTable table, Object value, boolean isSelected, boolean hasFocus, int r, int c) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, r, c);
            if (r == 0) {
                System.out.println(r + " " + c + " ");
            }
            try {
                setBackground(corFundo.get(r).get(c));
                setForeground(corFonte.get(r).get(c));
                // setSelectionBackground(corFundoSelec.get(r).get(c));
                // setSelectionForeground(corFonteSelec.get(r).get(c));
            } catch (Exception ex) {
                ex.printStackTrace();
                setBackground(padraoFundo);
                setForeground(padraoFonte);
                // setSelectionBackground(padraoFundoSelec);
                // setSelectionForeground(padraoFonteSelec);
            }
            return this;
        }
    };

    public MinhaTabela() {
        super();
        setDefaultRenderer(Object.class, meuRender);

        addMouseListener(new java.awt.event.MouseAdapter() {

            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tabMouseClicked(evt);
            }
        });
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(super.getModel());
        super.setRowSorter(sorter);
    }

    @Override
    public Component prepareRenderer(TableCellRenderer renderer,
            int rowIndex, int vColIndex) {
        Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
        if (c instanceof JComponent) {
            JComponent jc = (JComponent) c;
            jc.setToolTipText(getValueAt(rowIndex, vColIndex).toString());
        }
        return c;
    }

    @Override
    public void repaint() {

        super.repaint();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        try {
            return canEdit.get(rowIndex).get(columnIndex);
        } catch (Exception ex) {
            return padraoEdit;
        }
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        try {
            return types.get(columnIndex);
        } catch (Exception ex) {
            return java.lang.String.class;
        }
    }

    public DefaultTableModel getModelo() {
        return (DefaultTableModel) super.getModel();
    }

    public boolean isPadraoEdit() {
        return padraoEdit;
    }

    public void setPadraoEdit(boolean padraoEdit) {
        this.padraoEdit = padraoEdit;
    }

    public Color getPadraoFonte() {
        return padraoFonte;
    }

    public void setPadraoFonte(Color padraoFonte) {
        this.padraoFonte = padraoFonte;
    }

    public Color getPadraoFonteSelec() {
        return padraoFonteSelec;
    }

    public void setPadraoFonteSelec(Color padraoFonteSelec) {
        this.padraoFonteSelec = padraoFonteSelec;
    }

    public Color getPadraoFundo() {
        return padraoFundo;
    }

    public void setPadraoFundo(Color padraoFundo) {
        this.padraoFundo = padraoFundo;
    }

    public Color getPadraoFundoSelec() {
        return padraoFundoSelec;
    }

    public void setPadraoFundoSelec(Color padraoFundoSelec) {
        this.padraoFundoSelec = padraoFundoSelec;
    }

    private ArrayList<ArrayList<Boolean>> altera(ArrayList<ArrayList<Boolean>> antes, Boolean padrao, int linhas, int colunas) {
        if (linhas < 0) {
            linhas = getRowCount();
        }
        if (colunas < 0) {
            colunas = getColumnCount();
        }
        ArrayList<ArrayList<Boolean>> depois = new ArrayList<>();
        for (int i = 0; i < linhas; i++) {
            ArrayList<Boolean> col = new ArrayList<>();
            for (int j = 0; j < colunas; j++) {
                try {
                    col.add(antes.get(i).get(j));
                } catch (Exception ex) {
                    col.add(padrao);
                }
            }
            depois.add(col);
        }
        return depois;
    }

    private ArrayList<ArrayList<Color>> altera(ArrayList<ArrayList<Color>> antes, Color padrao, int linhas, int colunas) {
        if (linhas < 0) {
            linhas = getRowCount();
        }
        if (colunas < 0) {
            colunas = getColumnCount();
        }
        ArrayList<ArrayList<Color>> depois = new ArrayList<>();
        for (int i = 0; i < linhas; i++) {
            ArrayList<Color> col = new ArrayList<>();
            for (int j = 0; j < colunas; j++) {
                try {
                    col.add(antes.get(i).get(j));
                } catch (Exception ex) {
                    col.add(padrao);
                }
            }
            depois.add(col);
        }
        return depois;
    }

    private ArrayList<Class> alteraTipo(ArrayList<Class> antes, int colunas) {
        if (colunas < 0) {
            colunas = getColumnCount();
        }
        ArrayList<Class> col = new ArrayList<>();
        for (int j = 0; j < colunas; j++) {
            try {
                col.add(antes.get(j));
            } catch (Exception ex) {
                col.add(java.lang.String.class);
            }
        }
        return col;
    }

    public boolean setEditable(int row, int column, boolean editable) {
        try {
            ArrayList<Boolean> aaFundo = canEdit.get(row);
            aaFundo.set(column, editable);
            canEdit.set(row, aaFundo);
            return true;
        } catch (Exception ex) {
            setRowCount(getModelo().getRowCount());
            setColumnCount(getModelo().getColumnCount());
            try {
                ArrayList<Boolean> aaFundo = canEdit.get(row);
                aaFundo.set(column, editable);
                canEdit.set(row, aaFundo);
                return true;
            } catch (Exception exx) {
                return false;
            }
        }
    }

    public boolean setEditable(boolean etitable) {
        try {
            for (int row = 0; row < canEdit.size(); row++) {
                ArrayList<Boolean> aa = canEdit.get(row);
                for (int column = 0; column < aa.size(); column++) {
                    aa.set(column, etitable);
                }
                canEdit.set(row, aa);
            }
            return true;
        } catch (Exception ex) {
            setRowCount(getModelo().getRowCount());
            setColumnCount(getModelo().getColumnCount());
            try {
                for (int row = 0; row < canEdit.size(); row++) {
                    ArrayList<Boolean> aa = canEdit.get(row);
                    for (int column = 0; column < aa.size(); column++) {
                        aa.set(column, etitable);
                    }
                    canEdit.set(row, aa);
                }
                return true;
            } catch (Exception exx) {
                return false;
            }
        }
    }

    public void setRowCount(int rowCount) {

        corFundo = altera(corFundo, padraoFundo, rowCount, -1);
        corFonte = altera(corFonte, padraoFonte, rowCount, -1);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, rowCount, -1);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, rowCount, -1);
        getModelo().setRowCount(rowCount);
    }

    public void setColumnCount(int columnCount) {
        types = alteraTipo(types, columnCount);
        corFundo = altera(corFundo, padraoFundo, -1, columnCount);
        corFonte = altera(corFonte, padraoFonte, -1, columnCount);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, -1, columnCount);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, -1, columnCount);
        getModelo().setColumnCount(columnCount);
    }

    public boolean setRowColor(int row, Color backgorund, Color foreground) {
        boolean b = true;
        for (int i = 0; i < getColumnCount(); i++) {
            b = b && setColor(row, i, backgorund, foreground);
        }
        return b;
    }

    public boolean setColor(int row, int column, Color backgorund, Color foreground) {
        try {
            ArrayList<Color> aaFundo = corFundo.get(row);
            aaFundo.set(column, backgorund);
            corFundo.set(row, aaFundo);

            ArrayList<Color> aaFonte = corFonte.get(row);
            aaFonte.set(column, foreground);
            corFonte.set(row, aaFonte);

            setValueAt(getValueAt(row, column), row, column);
            return true;
        } catch (Exception ex) {
            setRowCount(getModelo().getRowCount());
            setColumnCount(getModelo().getColumnCount());
            try {
                ArrayList<Color> aaFundo = corFundo.get(row);
                aaFundo.set(column, backgorund);
                corFundo.set(row, aaFundo);

                ArrayList<Color> aaFonte = corFonte.get(row);
                aaFonte.set(column, foreground);
                corFonte.set(row, aaFonte);

                setValueAt(getValueAt(row, column), row, column);
                return true;
            } catch (Exception exx) {
                return false;
            }
        }
    }

    public Color getBackgroundColor(int row, int column) throws IndexOutOfBoundsException {
        return corFundo.get(row).get(column);
    }

    public Color getForegroundColor(int row, int column) throws IndexOutOfBoundsException {
        return corFonte.get(row).get(column);
    }

    public void addRow(ArrayList rowData, boolean editable) {
        int rowCount = getRowCount() + 1;
        corFundo = altera(corFundo, padraoFundo, rowCount, -1);
        canEdit = altera(canEdit, editable, rowCount, -1);
        corFonte = altera(corFonte, padraoFonte, rowCount, -1);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, rowCount, -1);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, rowCount, -1);

        Object o[] = new Object[rowData.size()];
        for (int i = 0; i < o.length; i++) {
            o[i] = rowData.get(i);
        }
        getModelo().addRow(o);
        this.repaint();
    }

    public void addColumn(Object columnName, Class type, boolean editable) {
        int columnCount = getColumnCount() + 1;
        types = alteraTipo(types, columnCount);
        try {
            types.set(getColumnCount(), type);
        } catch (Exception ex) {
        }
        canEdit = altera(canEdit, padraoEdit, -1, columnCount);
        corFundo = altera(corFundo, padraoFundo, -1, columnCount);
        corFonte = altera(corFonte, padraoFonte, -1, columnCount);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, -1, columnCount);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, -1, columnCount);
        getModelo().addColumn(columnName);
        this.repaint();
    }

    public void addColumn(Object columnName, ArrayList columnData, boolean editable) {
        int columnCount = getColumnCount() + 1;
        types = alteraTipo(types, columnCount);
        try {
            types.set(getColumnCount(), columnData.get(0).getClass());
        } catch (Exception ex) {
        }
        canEdit = altera(canEdit, padraoEdit, -1, columnCount);
        corFundo = altera(corFundo, padraoFundo, -1, columnCount);
        corFonte = altera(corFonte, padraoFonte, -1, columnCount);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, -1, columnCount);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, -1, columnCount);
        Object o[] = new Object[columnData.size()];
        for (int i = 0; i < o.length; i++) {
            o[i] = columnData.get(i);
        }
        getModelo().addColumn(columnName, o);
        this.repaint();
    }

    private void tabMouseClicked(java.awt.event.MouseEvent evt) {
        if (evt.getClickCount() == 2 && evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
            int selectRow = getSelectedRow();
            int selectColumn = getSelectedColumn();
            if (selectRow >= 0 && selectColumn >= 0) {
                String val = getValueAt(selectRow, selectColumn).toString();
                StringSelection ss = new StringSelection(val);
                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, ss);
            }
        }
        /*
         * if(evt.getButton()==java.awt.event.MouseEvent.BUTTON1){ int selectRow
         * = getSelectedRow(); int selectColumn = getSelectedColumn();
         * setRowColor(selectRow,
         * corFundoSelec.get(selectRow).get(selectColumn),
         * corFonteSelec.get(selectRow).get(selectColumn)); }
         */
    }

    public void filtro(Object value) {
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(super.getModel());
        if (value == null) {
            sorter.setRowFilter(null);
            super.setRowSorter(sorter);
            return;
        }
        String text = value.toString();
        if (text.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            try {
                sorter.setRowFilter(
                        RowFilter.regexFilter("(?i)" + text));
            } catch (PatternSyntaxException pse) {
            }
        }
        super.setRowSorter(sorter);
    }

    public void clear() {
        types = alteraTipo(types, 0);
        corFundo = altera(corFundo, padraoFundo, 0, 0);
        corFonte = altera(corFonte, padraoFonte, 0, 0);
        canEdit = altera(canEdit, padraoEdit, 0, 0);
        corFundoSelec = altera(corFundoSelec, padraoFundoSelec, 0, 0);
        corFonteSelec = altera(corFonteSelec, padraoFonteSelec, 0, 0);
        getModelo().setColumnCount(0);
        getModelo().setRowCount(0);
        this.repaint();
    }
}

Putz… de POGramação eu não entendo.

Estude como fazer seu próprio TableModel. Depois leia sobre como os componentes do JTable se integram.
Você vai ver que você não necessitará fazer filhos de JTable, como você fez.

E provavelmente seu código vai reduzir um bocado… pelo menos em complexidade.

Vini,
Acabei fazendo como você disse.
Criei meu TableModel, e meu TableCellRenderer, alterei também o modo de como as linhas são pintadas, o código ficou mais “bonito” agora. hehehehe

Mas ainda não desisti de entender porque a “mardita” da tabela não funcionava direito antes… quem sabe algum dia…

Obrigado pelas dica.