Como sobrescrever um método criado em um Listener do DefaultTableModel

Boa tarde senhores(as)!

Sou iniciante em Java, uso NetBeans 6.8, e estou com a seguinte dúvida:

Tenho uma tela que possui 4 JTables. Preciso saber quando uma linha foi incluída ou excluída destes JTables individualmente.

Procurando nos fóruns e páginas na internet, descobri o seguinte código (simplificado).

class MyTableModelListener implements TableModelListener {

    JTable table;

    MyTableModelListener(JTable table) {
        this.table = table;
    }

    public void tableChanged(TableModelEvent e) {

        switch (e.getType()) {
            case TableModelEvent.INSERT:
                System.out.println("Passei aqui - Insert");
                break;

            case TableModelEvent.DELETE:
                System.out.println("Passei aqui - Delete");
                break;
        }
    }
}

Funciona. Porém, terei que reescrever o mesmo código para para as 4 JTables. Daí, resolvi alterar o código acima para:

class MyTableModelListener implements TableModelListener {

    JTable table;

    MyTableModelListener(JTable table) {
        this.table = table;
    }

    public void tableChanged(TableModelEvent e) {

        switch (e.getType()) {
            case TableModelEvent.INSERT:
                afterInsert();
                System.out.println("Passei aqui - Insert");
                break;

            case TableModelEvent.DELETE:
                afterDelete();
                System.out.println("Passei aqui - Delete");
                break;
        }
    }

    public void afterInsert(){}
    public void afterDelete(){}
}

Ou seja, incluí dois métodos que, em teoria, resolveria meu problema se eu soubesse como sobrescrevê-los (Override) no código abaixo:

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;

public class Main extends JFrame {

    public Main() {
        super("Exemplo de uma tabela simples");

        final DefaultTableModel modelo = new DefaultTableModel();

        // constrói a tabela
        JTable tabela = new JTable(modelo);

        // adiciona o ouvidor de eventos
        tabela.getModel().addTableModelListener(new MyTableModelListener(tabela));

        // Cria duas colunas
        modelo.addColumn("Nome");
        modelo.addColumn("Idade");

        JButton btn = new JButton("Adicionar Linhas");
        btn.addActionListener(
                new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        String nome = JOptionPane.showInputDialog(null, "Informe o nome:");
                        String idade = JOptionPane.showInputDialog(null, "Informe a idade:");

                        // Adiciona uma linha
                        modelo.addRow(new Object[]{nome, idade});
                    }
                });

        tabela.setPreferredScrollableViewportSize(new Dimension(350, 50));

        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JScrollPane scrollPane = new JScrollPane(tabela);
        c.add(scrollPane);
        c.add(btn);

        setSize(400, 300);
        setVisible(true);
    }

    public static void main(String args[]) {
        Main app = new Main();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

O que eu quero é tornar a classe “MyTableModelListener” genérica, de modo que, toda vez que eu precisar usar um JTable e detectar a inserção e remoção de linhas, não precise reescrevê-la novamente. Apenas sobrescrever os métodos “afterInsert” e “afterDelete” que eu criei.

Para ser bem claro! Se eu tivesse dois JTables neste código simples (acima), eu só saberia detectar a inserção e remoção de linhas em cada JTable, criando uma classe “MyTableModelListener” (com nomes diferentes) para cada um. E eu não quero fazer isto.

Alguém saberia me ajudar? Ou pelo menos dizer se é possível o que eu quero fazer? Ou ainda, se existe outro jeito d’eu fazer isto?

Desde já, muito obrigado!

Aprenda a usar o JTable corretamente. E para fazer isso, comece se livrando do DefaultTableModel.

Quando eu tava começando a trabalhar com SWING, eu também estava utilizando DefaultTableModel ,mas ai o ViniGodoy e o Mark_Ameba me apresentaram a AbstractTableModel, ou seja, seu proprio modelo de Tabela, é uma maneira de trabalhar com JTable de maneira bem mais elegante, flexivel e simples… :mrgreen: