Olá,
Estou desenvolvendo um sistema em Java, onde ele lê os registros dos bancos de dados e preenche em uma jTable. Porem eu só consegui preencher ela quando é iniciado o jFrame e precisava que ele atualizasse a jTable toda vez que fosse inserido um registro novo no banco de dados sem ter que apertar um botão ou reabrir o jFrame.
Teria alguma forma de fazer isso?
qual banco de dados vc ta usando? de qualquer forma, tem algumas maneiras de fazer isso.
uma delas:
vc tem seu software em Java e o servidor ta em node (js). Vc pode emitir um evento com socket.io toda vez que houver algum tipo de interação com algum CRUD (EXEMPLO!!!), alguem criou um novo aluno (emite evento de novo aluno)…
Aí no seu front (java), vc faz alguma coisa com isso, atualiza a tabela, ou abre uma nova janela, algo que vc ache necessário
obs: O socket.io-client
está disponível no Java e é bem útil!!
Estou usando MySQL, esses novos registros estaria vindo de outra aplicação, no caso um app mobile. Ai no app desktop eh mostrado a informação que o usuário inseriu no app mobile.
vc ta inserindo os dados no seu banco direto do aplicativo?
Por se tratar de uma aplicação desktop, vc pode tentar implementar o pattern observer, que é vc fazer com que a sua tabela fique “escutando” determinadas ações para poder reagir de alguma forma.
@rodriguesabner se fosse uma aplicação web, com certeza iria comentar sobre =). Mas pelo jeito é uma aplicação desktop pq ele mencionou um JFrame ali.
Isso, o banco eh alimentado tanto do app Desktop como do app Mobile.
E não da pra aplicar isso no desktop?
Cara, vc pode fazer o que o Lucas comentou, ou unificar esse servidor. Aparentemente vc tem dois softwares fazendo a mesma.
Se botasse tudo num servidor só, o trabalho vai ser bem menor e a manutenção tb.
Dá sim, mas dependendo da aplicação dele, não faria muito sentido. Tipo, a propria aplicação emitir eventos que ela mesma consumiria e não tem mais nenhum outro sistema para poder consumir. O kafka é muito usado na arquitetura de microserviços mesmo.
Entendi Lucas, dei uma olhada aqui no pattern observer, porém não entendi como ele iria observar a tabela no banco de dados, saberia me dar um exemplo, por favor.
Então Rodrigues, no caso estou fazendo um aplicativo de pedidos para uma pizzaria. Logo, os pedidos são feitos pelo usuário através pelo aplicativo do celular, porém a pizzaria iria enxergar os pedidos e também alterar preços e incluir os produtos por meio do aplicativo do computador. No caso, o servidor é o mesmo, somente a aplicação que é diferente.
Tentei montar um exemplo didático:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Instância única do repositório
var repository = new MyRepository();
// Observer que será acionado quando o método "save" for acionado
OnSaveChannel observer = (String itemSalvo) ->
System.out.println("[NOTIFICACAO] O item salvo foi: " + itemSalvo);
// Adiciona o observer no repositorio
repository.addOnSaveObserver(observer);
// chama o método que irá acionar o observer
repository.save("teste");
}
static class MyRepository {
private List<OnSaveChannel> onSaveChannels = new ArrayList<>();
public void save(String value) {
// salva o valor recebido, por exemplo, num banco de dados
System.out.println("Item salvo com sucesso!");
// Notifica
onSaveChannels.forEach(c -> c.notifySave(value));
}
public void addOnSaveObserver(OnSaveChannel onSaveChannel) {
onSaveChannels.add(onSaveChannel);
}
}
@FunctionalInterface
static interface OnSaveChannel {
void notifySave(String itemSalvo);
}
}
Dessa forma, toda vez que o método salvar de MyRepository for invocado, o OnSaveChannel observer declarado no main será acionado.
Dessa forma como implementei, vc não poderia ter mais de uma instância de MyRepository, pois não funcionaria caso os observers fossem adicionados numa instância e o método salvar invocado fosse de outra.
Para tentar exemplificar melhor no seu caso, vc teria que passar detalhes de como vc está recuperando os dados para montar a tabela e qual a relação do frame onde está a tabela e o frame onde está o formulário de cadastro (se estão em frames diferentes ou no mesmo, por exemplo).