Table.dropCellBackground Retorna Null em Classe que Extend DefaultTableCellRenderer [RESOLVIDO]

2 respostas
Eder_Peixoto

Olá pessoal,

Criei um TableCellRenderer que extende a classe DefaultTableCellRenderer.
Quando o método getTableCellRendererComponent da minha classe é invocado, primeiramente chamo o getTableCellRendererComponent da classe DefaultTableCellRenderer, o qual por sua vez verifica se está sendo realizado um drop. Se true, obtém-se os Color do foreground e background, conforme abaixo:

//Classe javax.swing.table.DefaultTableCellRenderer.
    public Component getTableCellRendererComponent(JTable table, Object value,
                          boolean isSelected, boolean hasFocus, int row, int column) {

        Color fg = null;
        Color bg = null;

        JTable.DropLocation dropLocation = table.getDropLocation();
        if (dropLocation != null
                && !dropLocation.isInsertRow()
                && !dropLocation.isInsertColumn()
                && dropLocation.getRow() == row
                && dropLocation.getColumn() == column) {

            fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");    //O problema está aqui
            bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");    //O problema está aqui

            isSelected = true;
        }

        //(...)
    }

A minha classe possui a seguinte implementação do método getTableCellRendererComponent:

//Minha classe.
    @Override
    public java.awt.Component getTableCellRendererComponent( final javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
        super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );

        final Integer line = row + 1;
        final String text;

        if( this.format != null ){
            text = this.format.format( line );
        }
        else{
            text = line.toString();
        }

        super.setText( text );
        super.setHorizontalAlignment( this.alignmentHorizontal );

        return this;
    }//Fim do metodo.

Como implementei um DnD, quando o usuário está realizando um dragged, a célula onde está o mouse deveria ficar com a cor de uma linha selecionada, mas, por algum motivo que eu desconheço, não está.

Sendo assim, preciso saber porque a chamada DefaultLookup.getColor(this, ui, “Table.dropCellForeground”) e DefaultLookup.getColor(this, ui, “Table.dropCellBackground”) está retornando null,quando deveria retornar a cor de um célula selecionada.

2 Respostas

Eder_Peixoto

Descobri agora que na verdade o problema não é tanto por causa do DefaultLookup.getColor retornar null, pois apesar disso os métodos super.setForeground e super.setBackground são invocados. O problema está na classe java.awt.Component, no método abaixo transcrito:

//Classe java.awt.Component
    public void setBackground(Color c) {
        Color oldColor = background;
        ComponentPeer peer = this.peer;  //Aqui está retornando null.
        background = c;
        if (peer != null) {  //Como peer é null, não entra no if.
            c = getBackground();
            if (c != null) {
                peer.setBackground(c);
            }
        }
        // This is a bound property, so report the change to
        // any registered listeners.  (Cheap if there are none.)
        firePropertyChange("background", oldColor, c);
    }

Para que realmente configure a cor, é necessário que o ComponentPeer seja diferente de null. Mas, não sei porque, está null, e dessa forma a cor não é alterada. Para o caso do foreground a implementação e o problema é semelhante.

Eder_Peixoto

Pra resolver, tive que abandonar de extender a classe DefaultTableCellRenderer. Acabei por criar a minha própria classe básica.

Criado 9 de fevereiro de 2013
Ultima resposta 9 de fev. de 2013
Respostas 2
Participantes 1