Listeners e Eventos TableModel

Meus caros, boa tarde!

Li alguns conteúdos sobre listeners e eventos em jtables, tablemodels, etc. Porém ainda me restam algumas dúvidas.
Estou com o seguinte cenário de desenvolvimento:
Tenho 2 TableModels: (1 - tableModelVisaoGeral), que precisa ser atualizada com base nas alterações feitas na segunda (2 - tableModelPedCompra).
Minhas dúvidas são as seguintes:

  1. Coloco o listener na segunda tableModel e o evento na primeira tableModel ou vice-versa?
  2. Coloco os dois na mesma?
  3. Alguém tem algum exemplo de implementação de algo desse tipo?
  4. É recomendado usar o listener da jTable ou os da tableModelListener?
  5. É boa prática implementar os listeners/eventos na própria TableModel?

Agradeço o auxílio desde já!

Alguém?

@Rodrigo_Void
@staroski

Podem me dar um apoio?

Pesquisa o padrão de projeto Observer ou Listener (são sinônimos).

1 curtida

Obrigado pela atenção!
Li um conteúdo sobre o padrão mas estou com a seguinte dúvida: no meu caso implemento a classe/interface Observable/Observer ou utilizo os listeners do jTable?
Tenho uma jTable que irá observar várias outras jTAbles em abas diferentes na mesma janela.

Se os listeners da JTable servem para observar/ouvir o que você quer, utilize eles, senão crie sua própria estrutura.

Qual tipo de listener você precisa?

Preciso de um listener que detecte alterações nas tabelas e ative métodos na tabela principal para atualizar ela.

Comecei implementando a interface TableModelListener na tableModel principal. Sobrescrevi o método tableChanged. Parece que vai atender bem.
Adicionei ela como listener em outra tableModel secundária.
Consegui gerar alguns eventos e estou testando.

Estou no caminho certo?

a JTable já provê uma série de eventos para isso. Como ela é um Component, você tem eventos de mouse (click, over, etc), teclado (key pressed, released, etc) e, a partir deles, pode obter as linhas selecionadas (getSelectedRows) e colunas (getSelectedColumns), podendo combiná-las e ter valores em diferentes pontos (células) da JTable.
Cabe a você programar o comportamento que cada ação terá.
A abordagem (como vai fazer) depende de quanto você conhece da linguagem e como quer fazer. Esta abordagem de colocar os listeners no outro TableModel é uma questão de gosto, penso eu. Eu faria diferente, mas, se te atende, foque nisso.

1 curtida

Eu cheguei a olhar alguns listeners da jTable, mas me parece que não há listener relacionado a mudanças de valores. Tem listeners para ações do usuário.
Tem algum lugar que posso checar mais a fundo os listeners da jTable?

Já tentou o javadoc?

Se você sobrescrever o método setValueAt do TableModel, você saberá quando um valor é alterado em determinada célula e aí pode notificar seus ouvintes.

Prezados, bom dia.

Estou dando continuidade no desenvolvimento deste aplicativo mas na tabela principal que é a que fica escutando as outras tabelas, preciso atualizar os valores nela de acordo com as modificações nas tabelas secundarias.
No caso, não preciso saber qual a linha das tabelas secundarias foi modificada, só preciso pegar o objeto e setar um campo na tabela principal. Já consigo fazer isso.
A lógica que encontrei foi a do código abaixo:

@Override
public void tableChanged(TableModelEvent e) {
	Map<Integer, ProdutoGeral> mapTable = new HashMap<>();
	int count = 0;
	for (ProdutoGeral produto : produtosGeral) {
		mapTable.put(count, produto);
		count ++;
	}
	switch (e.getType()) {
	case TableModelEvent.INSERT:
		if (e.getSource() instanceof AlmoxTableModel) {
			
			for (ProdutoAlmox produtoAlmox : ((AlmoxTableModel) e.getSource()).getProdutosAlmox()) {
				int row = ProdutoGeral.getRowByCodBarras(mapTable, produtoAlmox);
				if ( row >= 0) {
					produtosGeral.get(row).setQtdProdAlmox(produtoAlmox.getQuantidadeProduto());
				}
				
			}
		}
		break;
	case TableModelEvent.UPDATE:
		
		break;
	case TableModelEvent.DELETE:
		
		break;

	default:
		break;
	}
}

Existe forma/classe/interface melhor?

Agradeço o apoio de todos mais uma vez!