Dúvidas usando ObjectTableModel

Tô fazendo um tutorial para o GUJ sobre como usar o HSQLDB 2.0(tem um aqui, mas ele é por cima, não faz nenhuma operação-search,update,insert,delete-no banco), e não quero perder tempo construindo N tablemodels.
Testei hoje o ObjectTableModel(by MarkyVasconcelos) e parece bem bacana.
Ao que interessa:
Num momento da App, o usuário entra num JFrame, e seleciona numa Combo o item que ele quer preencher numa JTable(logo abaixo dessa combo).Por Exemplo, digamos que o user selecionou “Atividade” na combobox.Aparecerão no JTable, 4 colunas(podem ser várias linhas):Atividade,frequência,minutos,média
As colunas Atividade e Média, já serão automaticamente preenchidas(Vem da tabela “Atividade”),
as de frequência e minutos serão preenchidas pelo usuário.Exemplo:
A F Min Méd
Cinema 120
Teatro 100

Perguntas:
1-Como eu faço o “binding” usando o ObjectTableModel para a utilização da tabela Usuario_atividade(que é a JTable que o usuário vai preencher) com Atividade(um model pegando alguns dados de outro)?Essa tabela será salva depois que o usuário preencher os campos.Sim, se tiverem 10 Atividades, serão 10 registros que serão salvos na tabela Usuario_atividade em sequência.

2-Dá para fazer um Formatter ter controle individual da célula comparando com outra?
Imagine que ele esteja preenchendo a coluna “Min”, ao passar para a debaixo, ocorrerá uma
verificação que compara o valor que o usuário digitou com a célula respectiva na coluna “Med”(ambas BigDecimal).
Se for menor, fica(a célula) vermelha, azul se for maior.

E antes que perguntem, sim JTable não é um DataGrid(deve ser evitado…), mas no caso serve para ilustrar o que eu quero mostrar(inclusive uns erros de inserção no BD).

Então, 1° voce devia ter um modelo que representa-se esse Usuario_Atividade com os atributos que voce quer para mostrar na JTable, e depois de mudar os valores nela voce deve pegar a lista de todos os itens e fazer a inserção/alteração ou qualquer outra coisa que quiser fazer com os dados.
Ou voce pode ter uma classe Usuario que tenha uma tributo Atividade, o model suporta voce pegar os dados dos atributos das classes e ainda altera-los pelas celulas da tabela.

2°, não da pra fazer isso, do modo que fiz, o formatter sabe apenas que um dado está vindo do model e ele precisa mandar formatado para a tabela ou vindo da tabela e converter para o tipo de dado original para ser colocado no model.

1-Na verdade, o model UsuarioAtividade só existirá mesmo depois do usuário preencher a JTable.Atividade está assim: id,Atividade, media
Usuario_Atividade:id,Atividade,frequência,minutos,média,Date
Só as 4 serão mostradas,não há uma forma de injetar os dados?Poe um pequeno exemplo.

2-Eu já fiz, só que não fica muito bonito, se pudesse interar entre Formatters iria ser punk.Usando um método porco, é só fazer assim:

class PintarVermelho extends JLabel implements TableCellRenderer{  
	private static final long serialVersionUID = -779716640255751715L;
public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column){
        setForeground(Color.RED);
     setText(value.toString());
     return this;
  }

  public void validate() {}
  public void revalidate() {}
  protected void firePropertyChange(String propertyName,
      Object oldValue, Object newValue) {}
  public void firePropertyChange(String propertyName,
      boolean oldValue, boolean newValue) {}
}//fim da classe PintarVermelho

Vou interando entre uma coluna e outra comparando o valor de uma célula com outra.
Se for menor:

 TableCellRenderer tcr = new PintarVermelho();
     columnParaModificar.setCellRenderer(tcr);           

funciona,mas…it tastes like gambiarra!

É, não tem como voce injetar desse jeito.

O que voce pode fazer é montar o é mesclar o Atividade e colocar nos models correspondentes em UsuarioAtividade, e mostrando o model já vai ter os valores que voce quer.

E ta ai, duas boas dicas para eu melhorar o model.
Só me falta tempo pra mudar =/

Pior seria se fosse gambiarra e com DefaultTableModel.
Hehe

Mas usando o ObjectTableModel como faço isso?
Dá para fazer um Atividade a = atividadeModel.getValue(3);//pegar média
e ir colocando em UsuarioAtividade?Fiquei meio perdido como eu notifico meu model principal(UsuarioAtividade) de que ele vai pegar esses valores de outro(ou de uma tabela do BD, por exemplo).

Então, pensei em fazer isso fora do model.

Voce pode fazer quando carrega do BD. Algo como:

rs = conn.executeQuery("select u.cp1, a.cp2, a.cp3 from usuario u join atividade a on a.id = c.atividadeId;");
while(rs.next()){
UsuarioAtividade ua = new UsuarioAtividade();
ua.setCp1(rs.get("u.cp1"));
ua.setCp2(rs.get("u.cp1"));
ua.setCp3(rs.get("u.cp1"));
lista.add(ua);
}
return lista;

E depois mandar listar a lista que isso retorna.
Ou então usar o query by example do hibernate (que vou ficar te devendo exemplo).

É, eu pensei da mesma forma.O problema dessa abordagem é que eu tenho que permitir que alguns campos sejam nulos para serem preenchidos depois.(Mas me parece a melhor forma, pois o model virá todo estruturado)
Não vou usar Hibernate.Tô no velho e bom JDBC para poder mostrar alguns erros de SQL para os usuários(como as famosas aspas simples/duplas…).

Mas sua dica ficou gravada, fazer umas magias negras pra copiar os atributos em alguns lugares. Hehe

Imaginei que voce provavelmente não usava hibernate por isso não postei o exemplo (E pra falar a verdade nem sei usar o Example direito).

Marky, onde estão os Docs da sua API?Quero saber quais os Formatters estão por padrão(por exemplo, meus números são bigdecimal, tenho que criar um BigDecimalFormatter para o usuario editar na tabela ou tem pronto?)…

É… docs :oops: esta faltando mesmo.

E o unico Formatter que tem é o DefaultFormatter.

/** 
  *This formatter assume all Object are String. 
  */ 
 public class DefaultFormatter implements Formatter { 
         @Override 
         public Object format(Object obj) { 
                 if (obj == null) 
                         return ""; 
                 return obj; 
         } 
  
         @Override 
         public Object parse(Object obj) { 
                 return obj; 
         } 
  
         @Override 
         public String getName() { 
                 return "string_basic"; 
         } 
 };  

É que quando eu fiz, eu não sabia se eu já implementava os formatters mais utilizados ou deixava para customizar, no final, deixei para customizar. Mas implementar varios deles é facil, e da até para colocar com default os comuns.