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!