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. ;)