Fala cambada, beleza?
Eu andei lendo aqueles topicos sobre TableModel e as recomendacoes
pra nao usar DefaultTableModel…
Escrevi uma classe, tentando utilizar Generics, com uma Annotation, que serve
para especificar o titulo da coluna.
A ideia basicamente é so marcar os atributos que se queira mostrar com a Annotation
@Relacao, sendo que a ordem das colunas eh a ordem em que os metodos aparecem no Bean.
Algo como
// 1a coluna da tabela
@Relacao(nomeColuna="Nome")
public String getNome()...
// Por nao ter @Relacao, nao apareceria...
public Long getIdade()...
// 2a coluna da tabela
@Relacao(nomeColuna="E-mail")
public String getEmail()...
Se possivel, gostaria que vcs dessem uma olhada, e talvez algumas dicas para melhorar o codigo.
Talvez ate algum recurso que seja mais facil do que eu usei…
Se puderem, eu agradeco.
A Annotation
package testes;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Relacao {
public String nomeColuna() default "";
}
E o TableModel:
// GenericTableModel
package testes;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class GenericTableModel <T> extends AbstractTableModel {
private List<T> valores;
public GenericTableModel(Collection<? extends T> pValores) {
this.valores = new ArrayList(pValores);
}
public int getRowCount() {
return valores.size();
}
public int getColumnCount() {
int colCont = 0;
if (!this.valores.isEmpty()){
T umObjeto = this.valores.get(0);
Method listaMetodos[] = umObjeto.getClass().getMethods();
for (Method umMetodo : listaMetodos){
if (!umMetodo.getName().startsWith("get"))
continue;
if (umMetodo.isAnnotationPresent(Relacao.class)){
colCont++;
}
}
}
return colCont;
}
@Override
public String getColumnName(int coluna) {
String nomeColuna = "";
if (!this.valores.isEmpty()) {
int contador = 0;
T umObjeto = this.valores.get(0);
Method listaMetodos[] = umObjeto.getClass().getMethods();
for (Method umMetodo : listaMetodos){
if (!umMetodo.getName().startsWith("get")) {
continue;
}
if (umMetodo.isAnnotationPresent(Relacao.class)){
if (contador == coluna){
nomeColuna = umMetodo.getAnnotation(Relacao.class).nomeColuna();
}
contador++;
}
}
}
return nomeColuna;
}
public Object getValueAt(int linha, int coluna) {
int contador = 0;
Object retorno = null;
if (!this.valores.isEmpty()){
T umObjeto = this.valores.get(linha);
Method listaMetodos[] = umObjeto.getClass().getMethods();
for (Method umMetodo : listaMetodos){
if (!umMetodo.getName().startsWith("get"))
continue;
if (umMetodo.isAnnotationPresent(Relacao.class)){
if (contador == coluna){
try {
retorno = umMetodo.invoke(umObjeto);
} catch (IllegalAccessException e){
System.out.println("Erro [IllegalAccessException]: " + e.getMessage());
} catch (InvocationTargetException e){
System.out.println("Erro [InvocationTargetException]: " + e.getMessage());
}
}
contador++;
}
}
}
return retorno;
}
@Override
public void setValueAt(Object oValor, int linha, int coluna) {
if (!this.valores.isEmpty()) {
int contador = 0;
T umObjeto = this.valores.get(linha);
Method listaMetodos[] = umObjeto.getClass().getMethods();
for (Method umMetodo : listaMetodos){
if (!umMetodo.getName().startsWith("get"))
continue;
if (umMetodo.isAnnotationPresent(Relacao.class)){
if (contador == coluna){
try {
String nomeMetodoSet = "set" + umMetodo.getName().substring(3);
Method metodoSet = umObjeto.getClass().getMethod(nomeMetodoSet,umMetodo.getReturnType());
metodoSet.invoke(umObjeto, oValor);
} catch (NoSuchMethodException e){
System.out.println("Erro [NoSuchMethodException]: " + e.getMessage());
} catch (IllegalAccessException e){
System.out.println("Erro [IllegalAccessException]: " + e.getMessage());
} catch (InvocationTargetException e){
System.out.println("Erro [InvocationTargetException]: " + e.getMessage());
}
}
contador++;
}
}
}
}
@Override
public Class<?> getColumnClass(int coluna) {
Class retorno = null;
if (!this.valores.isEmpty()) {
T umObjeto = this.valores.get(0);
Method listaMetodos[] = umObjeto.getClass().getMethods();
int contador = 0;
for (Method umMetodo : listaMetodos){
if (!umMetodo.getName().startsWith("get"))
continue;
if (umMetodo.isAnnotationPresent(Relacao.class)){
if (contador == coluna){
retorno = umMetodo.getReturnType();
}
contador++;
}
}
}
return retorno;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public T get(int row) {
return valores.get(row);
}
}
