JTable + CheckBox atualizando

3 respostas
D

Pessoal, tenho uma classe que extends uma AbstractTableModel na qual foi definida uma coluna do tipo checkbox. Gostaria de saber se existe algum método que verifica a mudança de um checkbox dentro de um model de uma tabela. Minha intençao é permiotir a execução de alguns métodos quando existir algum CheckBox selecionado.

Obrigado

3 Respostas

ViniGodoy

O setValueAt é chamado toda vez que um valor é alterado. Não bastaria colocar as chamadas dos métodos lá?

D

Meu método deve tornar um botao.setEnable(true) sempre que algum check for marcado e Botao.setEnable(false) caso contrário. De acordo com a tua sugestao, acabarei perdendo a ideia de utilização genérica, ou seja, restringir a utilização aos botoes pré-determinados. Alguma sugestão para não limitar o uso deste model?
obrigado

ViniGodoy

Sim. Use o padrão observer.

1. Crie o evento:
public class CampoBooleanEvent extends EventObject {
   private int linha;
   private boolean novoValor;

   public void CampoBooleanEvent(int linha, boolean novoValor) {
      this.linha = linha;
      this.novoValor = novoValor;
   }
   public int getLinha() {return linha;}
   public boolean getNovoValor() {return novoValor;}
}
1. Crie uma interface, que será o observer (no java chamado de listener) do seu evento:
CampoBooleanChangeListener extends EventListener {
    void campoMudou(CampoBooleanEvent e);
}

3. Depois, em seu model, adicione um set para seus listeners, um método para registrar e desregistrar os listeners e o código para o disparo do evento:

public seuModel extends AbstractTableModel
{
     private Set<CampoBooleanChangeListener> listeners = new HashSet<CampoBooleanChangeListener>();
     
     //Sua implementação do model vem aqui
 
     public void addListener(CampoBooleanChangeListener listener) {
         listeners.add(listener);
     }

     public void removeListener(CampoBooleanChangeListener listener) {
        listeners.remove(listener);
     }

     protected void fireCampoBooleanChanged(int linha, boolean novoValor) {
         CampoBooleanEvent evt = new CampoBooleanEvent (linha, valor);
         for (CampoBooleanChangeListener listener : listeners) {
            listener.campoMudou(evt);
      }
   }

}
4. Finalmente, altere o seu método setValueAt para notificar os listeners sobre a mudança no campo:
void setValueAt(int line, int column, Object value) {
    if (line == LINHA_DO_BOOLEAN) {
       novoValor = (Boolean)(value);

       //Resto do seu código vem aqui, e por fim, notifique os listeners:
       fireCampoBooleanChanged(line, novoValor);
    }
}

Agora, seu model também dispara eventos! Assim, você mantém a flexibilidade e ainda notifica as classes que usam o model sobre mudanças. ;)

Criado 14 de maio de 2007
Ultima resposta 15 de mai. de 2007
Respostas 3
Participantes 2