[JAVA] [ARRAYLIST] ArrayList Imprime repetidas vezes ou imprime apenas a última informação

Pessoal, estou com uma pequena dúvida que é a seguinte. Neste trecho de código, eu gostaria de armazenar as informações digitadas num ArrayList, e mostrar o ArrayList em todas as suas posições quando eu clicar no botao sair (btnSair), porém se eu colocar para percorrer o ArrayList dentro do evento do btnSair, só imprime o último registro adicionado, e não os outros.
Se eu coloco dentro do evento do btnAdicionar, ele imprime várias vezes, imprime na mesma quantidade de vezes do número da posição do Array.

Por que isso acontece?

public void actionPerformed(ActionEvent e) {
if (e.getSource()== btnAdicionar) {

//PASSANDO OS ATRIBUTOS PARA A CLASSE CONTATOS
contato.setNome(txtNome.getText());
contato.setTelefone(txtTelefone.getText());
contato.setEmail(txtEmail.getText());
contato.setRua(txtRua.getText());
contato.setNumero(txtNumero.getText());
contato.setBairro(txtBairro.getText());
contato.setCidade(txtCidade.getText());
contato.setEstado(txtEstado.getText());

			//LIMPANDO TODOS OS CAMPOS
			txtNome.setText("");
			txtTelefone.setText("");
			txtEmail.setText("");
			txtRua.setText("");
			txtNumero.setText("");
			txtBairro.setText("");
			txtCidade.setText("");
			txtEstado.setText("");
			
			JOptionPane.showMessageDialog(null, "Contato " + " '"+ contato.getNome()+"'" +" Cadastrado com sucesso!");
			
			//ADICIONANDO AO ARRAY
			array.add(contato);
			
			//MOSTRANDO O QUE FOI ADICIONADO
			
			//USANDO O FOR, ELE IMPRIME A QUANTIDADE DE VEZES QUE O ARRAY TEM DE TAMANHO.
			// POR EXEMPLO, SE FOR IMPRIMIR A INFORMAÇÃO QUE ESTÁ NA POSIÇÃO 3, ELE IMPRIME 3 VEZES A MESMA INFORMAÇÃO.
		
			
			
		} else if (e.getSource() == btnSair) {
			TelaAgenda.this.dispose();

			for (int n=0; n<array.size(); n++) {
				System.out.println(array.get(n));
				System.out.println("========================");
			}
			
		}
   		
   }

Aparentemente vc está adicionando no List sempre o mesmo obj contato. Vc precisa sempre criar um NEW Contato, do contrario ele manterá a referência do obj e quando alterar um atributo do contato q vc já adicionou, isso será refletido a todos os lugares q estão referenciando aqele objeto.
REFERÊNCIAS!!!

Se você quer exibir as informações de um objeto, no caso ‘contato’, não use laço de repetição como o for. Você pode usar o toString(), bem mais pratico.

Estranho voce querer exibir as informações com o botao sair. Porque nao criar um botao para exibir as informações, e deixar o de sair como está?

Quero usar o for para recorrer todo o ArrayList, mostrar a informação em cada posição…

Estou colocando no botao Sair apenas para fazer um teste e ver se está funcionando tudo certo, mas futuramente vou fazer um botao de exibir as informações mesmo! :smiley:

Consegue me ajudar dizendo como farei isso? Tentei, mas não compreendi a lógica de criar um new Contato quando adicionar o primeiro, e como passar os atributos para o “contato2”

Toda vez que você clicar no botão, você deve criar um objeto e então setar os valores nos atributos dele.

1 curtida

Para criar um new contato

public void actionPerformed(ActionEvent e) {
		if (e.getSource()== btnAdicionar) {
			contato = new Contatos();
                         ...
                        }
}

Resolvido! Muito obrigado.
Este era o problema. Coloquei o que você sugeriu, e funcionou da maneira que eu esperava, agora todos os contatos ficam adicionados no Array, e com um for eu consigo imprimir tudo após fechar a tela de adicionar contatos.

Então, o que eu estava fazendo era adicionando tudo ao mesmo objeto, e depois o sobrescrevendo, mas o que eu fiz exatamente ao declarar “contato = new Contatos();” ?

Diz que toda vez que o botão for acionado, será criado um novo objeto do tipo Contatos, mas eu não teria que dar o nome a cada objeto criado?

Não é necessario dar um numero ou nome para cada objeto criado (quando voce aprendeu a fazer dessa forma, foi so para fins acadamicos). Quando voce cria um novo objeto voce está criando um novo endereço de memoria e não sobrescrevendo. Vejo o new como um novo endereço de memoria

1 curtida