[Resolvido] Duvida sobre override

Seguinte pessoal tenho o seguinte código. E tenho duas dúvidas:
1 Tipo eu sei que o método “getTableCellRendererComponent” foi sobrescrito. O que quero entender é o seguinte … essa chamada ao construtor da super dentro do construtor dessa classe filhas indica que, eu quero que use todos os métodos etc da classe mãe e quando for usar o método “getTableCellRendererComponent” que foi sobrescrito ele usa o método da classe fliha estou correto?

2 Ta dando erro na chamada do construtor da super :confused: Alguém sabe me dizer porque?
Erro “call to super must be first statement in constructor”

Obrigado!

package vanclamodel;

import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class CellRenderer extends DefaultTableCellRenderer {
    
private static final long   serialVersionUID    = 1L;  
  
    public void CellRenderer(){  
        super();  
    }  
  
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {  
        this.setHorizontalAlignment(CENTER);  
  
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);  
    }  
} 

Cara posta a stacktrace do erro ai

Como pegar a stacktrace? :confused:

vc ta criando o construtor errado. Construtores não tem tipo de retorno. O certo seria

public CellRenderer(){ super(); }

[quote=marcos4ft]vc ta criando o construtor errado. Construtores não tem tipo de retorno. O certo seria

public CellRenderer(){ super(); } [/quote]

hehe que vergonha. Obrigado! E quanto a minha primeira dúvida, alguém saberia responder?

Você deve informar ao JTable que quer usar esse renderer:

Por exemplo, para esse renderer ser usado para tipos inteiros, você faria:

seuTable.setDefaultRenderer(Integer.class, new CellRenderer());

Esse tipo deve ser retornado no método getColumnClass() do seu model.

[quote=ViniGodoy]Você deve informar ao JTable que quer usar esse renderer:

Por exemplo, para esse renderer ser usado para tipos inteiros, você faria:

seuTable.setDefaultRenderer(Integer.class, new CellRenderer());

Esse tipo deve ser retornado no método getColumnClass() do seu model.[/quote]
Eu fiz da seguinte forma e funfou :confused: Está correto do jeito que fiz, ou deveria fazer do jeito que você falou?

OBS: É estou usando DefaultTableModel mas é que é meio urgente essa aplicação. Mas assim que tiver tempo aprendo a implementar minha TableModel rs …

public DefaultTableModel modelo = new DefaultTableModel();
public JTable tabela = new JTable(modelo);

//Algumas declarações omitidas

tabela.getColumnModel().getColumn(0).setCellRenderer(new CellRenderer());//centralizar texto dessa coluna

Também pode ser.

Se é urgente sua aplicação, pq vc está jogando tempo fora com o DefaultTableModel?

[quote=ViniGodoy]Também pode ser.

Se é urgente sua aplicação, pq vc está jogando tempo fora com o DefaultTableModel?[/quote]

ahahh você não recua né velho. Po cara, tipo … até eu conseguir implementar minha própria TableModel perderia tempo precioso pra meu chefe rs … preciso fazer isso logo. Mas juro que já estou estudando essa parada. Na verdade já implementei uma, mas preciso estudar mais a fundo pra fazer uma bem feita e também entender totalmente o código.rs …
Cara você sabe responder minha primeira dúvida nesse tópico? Se sim responda por favor! E muito obrigado!!

O super no construtor chama o construtor da mãe.
Se você não sobrescrever um método na filha, ele rodará automaticamente com o comportamento da mãe.

Falo pq implementar uma tabela com DefaultTableModel é bem mais difícil. Provavelmente você vai perder muito mais tempo implementando a parte de alteração e exclusão de registros, do que se você parasse para estudar como fazer direito de uma vez…

[quote=ViniGodoy]O super no construtor chama o construtor da mãe.
Se você não sobrescrever um método na filha, ele rodará automaticamente com o comportamento da mãe.

Falo pq implementar uma tabela com DefaultTableModel é bem mais difícil. Provavelmente você vai perder muito mais tempo implementando a parte de alteração e exclusão de registros, do que se você parasse para estudar como fazer direito de uma vez…[/quote]

Ata entendi, mas é que na verdade não altero direto a table e sim no banco. A table serve apenas para mostrar os dados do banco. Ou seja quando o usuário deletar algum dado será deletado no banco e não na table e a table carregará a lista.

Bom dia a todos.

[quote=kira911]Seguinte pessoal tenho o seguinte código. E tenho duas dúvidas:

1 Tipo eu sei que o método “getTableCellRendererComponent” foi sobrescrito. O que quero entender é o seguinte … [color=red]essa chamada ao construtor da super dentro do construtor dessa classe filhas indica que, eu quero que use todos os métodos etc da classe mãe e quando for usar o método “getTableCellRendererComponent” que foi sobrescrito ele usa o método da classe fliha estou correto?[/color]

[/quote]

No caso em destaque, você não está correto.

Quando você invoca a chamada do construtor da classe mãe, na verdade você está invocando a execução do código que está implementado dentro do construtor da classe mãe. O uso de todos os métodos das super classes ou classes mães (como preferir chamar), foi acoplado nas sub classes (classes filhas) no momento em que você implementou a herança (extends) na declaração da classe.

Quando um método é sobrescrito, ele só executará o código implementado na classe filha, e quando voce quiser que, além desse código, o código do referido método na super classe seja também executado, ai voce tem que fazer a referência com a sintaxe super e logo em seguida invocar com a assinatura do método. Exemplo:

  public class PrimeiraClasse {
        
         public PrimeiraClasse() {
                System.out.println("Estou executando o construtor da primeira classe");
         }

         public void fazendoAlgo(){
                System.out.println("Estou fazendo algo na primeira classe");
         }
   }

   public class SengundaClasse  extends PrimeiraClasse {

         public SegundaClasse() {
              /* Aqui qualquer instância da SegundaClasse,
                  no momento em que for instanciada em memória,
                  vai imprimir no console o texto "Estou executando o construtor da primeira classe"; */
              super()
         }

         @Override
         public void fazendoAlgo() {
              // Aqui eu vou executar o método fazendoAlgo() da super classe.
              super.fazendoAlgo();
              // Para depois executar o que foi sobrescrito;
              System.out.println("Agora estou fazendo algo na SegundaClasse");
         }
  }

Entendeu

Discorpio e todo o pessoal muito obrigado pela ajuda! A dúvida está resolvida e é assim que caminhamos para o conhecimento rs …

Valeu!

Olá, sou eu de novo.

[quote=kira911]Discorpio e todo o pessoal muito obrigado pela ajuda! A dúvida está resolvida e é assim que caminhamos para o conhecimento rs …

Valeu![/quote]

O importante é que você caminhe [color=red]com[/color] o conhecimento e não [color=red]para [/color] o conhecimento.

DEUS fez o conhecimento e o deu ao homem e não deu o homem ao conhecimento.

Estou fazendo uma analogia que Jesus disse na bíblia em Marcos 2:27 que diz: E disse-lhes: O sábado foi feito por causa do homem, e não o homem por causa do sábado. Existem versões que diz assim: E disse-lhes: O sábado foi feito para o homem, e não o homem para o sábado.

Assim sendo, por analogia, se aplica também ao conhecimento.

Um abraço