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
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
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
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