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:
Coloco o listener na segunda tableModel e o evento na primeira tableModel ou vice-versa?
Coloco os dois na mesma?
Alguém tem algum exemplo de implementação de algo desse tipo?
É recomendado usar o listener da jTable ou os da tableModelListener?
É boa prática implementar os listeners/eventos na própria TableModel?
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.
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.
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.
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?
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.
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;
}
}