Atualização dos dados exibidos em JTable

Boa tarde a todos.

Tenho um sistema com um JFrame principal e diversos JDialog secundários utilizando JTables. Criei um TableModel para cada JDialog.
Ao iniciar o aplicativo, esses JDialogs são carregados, porém são exibidos apenas quando o usuário clica em determinado botão da seguinte maneira:

JFrame - Principal
JDialog - Clientes
JDialog - Produtos
JDialog - Categorias

Tanto dentro do JFrame Principal, quanto dentro do JDialog, tenho a opção de criar/atualizar um cliente, produto, …

O que gostaria de saber é como poderia fazer para quando fosse criando/atualizado um novo Cliente, Produto, …, os dados da tabelas sejam
atualizados.

Segue código utilizado

// JFrame Principal
    // Dialogs
    protected DialogCarregandoAplicacao dialogCarregandoAplicacao;
    protected DialogClienteList dialogClienteList;
    protected DialogClienteNovo dialogClienteNovo;
    protected DialogProdutoList dialogProdutoList;
	
    protected Cliente c;
	
    protected JTextArea textArea;
    protected JScrollPane pane;

    public Principal() {
    }
	
    public Principal(LayoutManager layout) {
        super(layout);

        //Lay out the content pane.
        setPreferredSize(new Dimension(450, 150));
        initComponents(); // Carrega componentes
        initDialogs();        // Carrega Dialogs
    }
    public void initComponents() {
        //Create a scrolled text area.
        textArea = new JTextArea(5, 30);
        textArea.setEditable(false);
        pane = new JScrollPane(textArea);
        add(pane, BorderLayout.CENTER);
    }
    public void initDialogs() {
    	dialogClienteList = new DialogClienteList();
    	dialogClienteNovo = new DialogClienteNovo();
    	dialogProdutoList = new DialogProdutoList();
    }

    // Funçoes para criar menus e actions

    private static void createAndShowGUI() {
    	
        //Create and set up the window.
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true); // Remove a barra de titulos
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH); // Define o tamanho como maximizado
        
        
        //Create/set menu bar and content pane.
        Principal demo = new Principal(new BorderLayout());
        frame.setJMenuBar(demo.createMenuBar()); // Criar o menuBar
        demo.createToolBar();  // Cria um toolBar com botoes
        demo.setOpaque(true); //content panes must be opaque
        frame.setContentPane(demo);

        demo.dialogCarregandoAplicacao.dispose();
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, "Classe nao encontrada! "+ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, "Erro de Instanciacao! "+ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, "Acesso Ilegal! "+ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        //
 
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    // Código do action que abre o dialog que criar um cliente novo
    @SuppressWarnings("serial")
    public class novoClienteAction extends AbstractAction {
		public novoClienteAction(String text, String desc, Integer mnemonic) {
    		super(text);
            putValue(SHORT_DESCRIPTION, desc);
            putValue(MNEMONIC_KEY, mnemonic);
    	}
		@Override
		public void actionPerformed(ActionEvent e) {
			dialogClienteNovo.setVisible(true);
		}
    	
    }

    // Código da action que exibe a JDialog que contém o JTable que desejo ser atualizado ao criar/atualizar um Cliente
    @SuppressWarnings("serial")
    public class consultaClienteAction extends AbstractAction {
    	public consultaClienteAction(String text, String desc, Integer mnemonic) {
    		super(text);
    		putValue(SHORT_DESCRIPTION, desc);
    		putValue(MNEMONIC_KEY, mnemonic);
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		dialogClienteList.setVisible(true);
    	}
    }

Código do JDialog que contém a JTable

	private JTable table = new JTable();
	private TableRowSorter<tmClientes> sorter;
	private List<Cliente> lista;
	private ClienteDAO cDAO;

	
	public DialogClienteList() {

		setUndecorated(true); // Remove a barra de titulo
		
		// Iniciar components, tabela e actions
		initActions(); // Inicia as actions
		initComponents(); // Inicia os componentes (Botoes, DAO, Entity Cliente, JTextFields, JButtons, ...
		initTable();
		
		createGUI();
	}
	public void initTable() {
		table.setModel(new tmClientes(lista));
		table.setPreferredScrollableViewportSize(new Dimension(1000,300));
		table.setFillsViewportHeight(true);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		
		// Nas proximas duas linhas e criado e definido que nossa tabela agora,
		// podera ordenar os dados, clicando no nome da coluna correspondente
		sorter = new TableRowSorter<tmClientes>((tmClientes)table.getModel());
		table.setRowSorter(sorter);
		
		// Parte personalizada onde pega-se o total de colunas que a tabela possui
		// e percorre uma a uma indicando seu tamanho
		int total = ((tmClientes) table.getModel()).getTamanhoColunas().length;
		for (int i = 0 ; i < total ; i++) {
			TableColumn column = (TableColumn)table.getColumnModel().getColumn(i);
			column.setMinWidth(((tmClientes)table.getModel()).getTamanhoColunas()[i]);
		}
		
		pane = new JScrollPane(table);
		pack();
	}

Desde ja agradeço a atenção.

Obrigado

Amigo, cade seu TableModel? Ele é extendido de AbstractTableModel?

Foi mal, não ter colocado meu tableModel,
Ele é extendido do AbstractTableModel sim. Estou criando um TableModel para cada janela que preciso.

public class tmClientes extends AbstractTableModel{

	private static final long serialVersionUID = new br.com.schiefler.confeccao.Utilities.Vars().getVersionUID();

	// Variaveis
	protected Utils util = new Utils();
	
	// constantes que vao representar as colunas
	// Apenas para facilitar o codigo
	protected final int COL_CPF = 0;
	protected final int COL_Nome_Completo = 1;
	protected final int COL_Tel1 = 2;
	protected final int COL_Tel2 = 3;
	protected final int COL_Cel1 = 4;
	protected final int COL_Cel2 = 5;
	protected final int COL_Cel3 = 6;
	protected String[] colunas = new String[]{"CPF", "Nome Completo", "Tel 1", "Tel 2", "Cel 1", "Cel 2", "Cel 3"};
	protected int[] tamanhoColunas = new int[]{ 100, 200, 90, 90, 100, 100, 100 };

	protected List<Cliente> lista;
	
	public tmClientes(List<Cliente> lista) {
		this.lista = lista;
	}
	
	// Cada cliente sera uma linha na tabela/
	public int getRowCount() {
		return lista.size();
	}
	
	// Vamos exibir o total de 7 colunas
	public int getColumnCount() {
		return colunas.length;
	}
	
	// Explicita o nome de cada coluna
	@Override
	public String getColumnName(int column) {
		return colunas[column];
	}

	// retorna a classe que representa a coluna
	@Override
	public Class<?> getColumnClass (int Column) {
		return String.class;
	}

	// Pega o cliente da lista
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Cliente c = lista.get(rowIndex);
		switch (columnIndex) {
		case 0:
			return util.convertCPFLongToString(c.getCPF());
		case 1:
			return c.getPrimeiroNome() + " " + c.getUltimoNome();
		case 2:
			return util.convertTelLongToString(c.getTel1());
		case 3:
			return util.convertTelLongToString(c.getTel2());
		case 4:
			return util.convertCelLongToString(c.getCel1());
		case 5:
			return util.convertCelLongToString(c.getCel2());
		case 6:
			return util.convertCelLongToString(c.getCel3());
		default:
			return "";
		}
	}
	
	public int[] getTamanhoColunas() {
		return tamanhoColunas;
	}
	

Amigo, você precisa implementar um metodo na sua model para pegar a classe da linha que está sendo editada e então passa o mesma classe para sua JFrame que vai editar a classe, logo quando você concluir a edição a classe vai ser alterada no TableModel consequentemente vai alterar a linha.

Vou deixar abaixo como eu faço o meu TableModel.

Repare nos ultimos metodos da classe, o metodo addPessoa, removePessoa e o getPessoa

[code]
package br.com.fac.JTableModel;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import br.com.fac.classe.Pessoa;

public class JTableModelPessoa extends AbstractTableModel {

private List<Pessoa> linhas;

private String[] colunas;

public JTableModelPessoa(String[] colunas) {
	this.colunas = colunas;
	this.linhas = new ArrayList<Pessoa>();
}

public JTableModelPessoa(List<Pessoa> listaDePessoas) {
	linhas = new ArrayList<Pessoa>(listaDePessoas);
}

@Override
public int getColumnCount() {
	return colunas.length;
}

@Override
public int getRowCount() {
	return linhas.size();
}

@Override
public String getColumnName(int columnIndex) {
	return colunas[columnIndex];
};

@Override
public Class<?> getColumnClass(int columnIndex) {
	switch (getColumnName(columnIndex)) {
	case "ID":
		return Integer.class;
	case "Nome":
		return String.class;
	case "Pessoa Ativa":
		return boolean.class;
	case "E-mail":
		return String.class;
	case "Fone Residencial":
		return String.class;
	case "Fone Celular":
		return String.class;
	default:
		return String.class;
	}
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
	Pessoa pessoa = linhas.get(rowIndex);

	switch (getColumnName(columnIndex)) {
	case "ID":
		return pessoa.getPessoaId();
	case "Nome":
		return pessoa.getPessoaNome();
	case "Pessoa Ativa":
		return pessoa.isPessoaAtiva() == false ? "Ativa" : "Inativa";
	case "E-mail":
		return pessoa.getPessoaEmail();
	case "Fone Residencial":
		return pessoa.getPessoaFoneResidencial();
	case "Fone Celular":
		return pessoa.getPessoaFoneCelular();
	default:
		throw new IndexOutOfBoundsException("columnIndex out of bounds");
	}
}

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {};

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
	return false;
}

public Pessoa getPessoa(int indiceLinha) {
	return linhas.get(indiceLinha);
}

public void addPessoa(Pessoa pessoa) {
	linhas.add(pessoa);
	int ultimoIndice = getRowCount() - 1;
	fireTableRowsInserted(ultimoIndice, ultimoIndice);
}

public void removePessoa(int indiceLinha) {	
	linhas.remove(indiceLinha);
	fireTableRowsDeleted(indiceLinha, indiceLinha);
}

public void addListaDePessoas(List<Pessoa> pessoas) {
	int tamanhoAntigo = getRowCount();
	linhas.addAll(pessoas);
	fireTableRowsInserted(tamanhoAntigo -1, getRowCount() -1 );
}

public void limpar() {
	linhas.clear();
	fireTableDataChanged();
}

public boolean isEmpty() {
	return linhas.isEmpty();
}

}[/code]

Ola wilsonsbo, tudo bem?
No geral, seu código está parecido com o meu, tenho em meu código as funções que você colocou ao final, quais sejam: addPessoa, removePessoa, …

Como está desenvolvido meu sistema:

Tenho um JDialog chamado DialogClientesList, onde lista todos os clientes em um JTable, como AbstractTableModel que coloquei anteriormente. Nesse JDialog, tenho dois botões: Atualizar e Novo, que abrem um outro JDialog para atualizar ou criar um cliente novo. Dentro desse novo JDialog criado, tenho o botão salvar.
Minha dúvida recae em como fazer para que, ao clicar no botão salvar, a JTable seja atualizada novamente?
Pelo seu código, qual dos dois construtores iria utilizar para criar a variável?
Após criar, qual função chamaria para que disparasse um fireTableDataChanged?
Tenho que carregar a lista com todos os clientes novamente? Faço uma remoção do cliente na lista e adiciono ele novamente? E para deixar a JTable com a mesma ordem?

Obrigado pela ajuda.