Atualizar elementos de arraylist dentro de um Jlabel

Estou com um projeto da faculdade pra terminar e preciso de ajuda. É um jogo de cartas. Eu construí um ArrayList para armazenar as cartas e listando os elementos dessa lista em um Jlabel através de um for. Até aqui tudo bem, no entanto, preciso que cada vez que um elemento dessa lista seja removido ou adicionado, o Jlabel onde as imagens estão seja atualizado e mostra o novo número de cartas. Essa exibição atualizada das cartas poderá ser ativada através de um botão “pegarCarta” ou “Descartar”. Já tentei usar o repaint() mas não tive sucesso. Espero que possam me ajudar! Abaixo segue o código(Desculpem a bagunça mas estou testando e nem sempre lembro de organizar o código antes de ficar pronto):

[code]package ifpb.monteiro.p2.projetoFinal;

import java.awt.EventQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.FlowLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GUITelaJogo extends JFrame {

public ArrayList<String> maoJogador = new ArrayList<>(); // Arraylist com o nome que o jogador terá na mão.
private ArrayList<ImageIcon> lista = new ArrayList<>(); //Arraylista que conterá as cartas(objeto) que tem na mão do jogador*/

/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				GUITelaJogo frame = new GUITelaJogo();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame. 
 */
public GUITelaJogo() {
	
	
	
	maoJogador.add("asPaus");	//Adicionando cartas à mão do jogador
	maoJogador.add("doisOuro");	//Adicionando cartas à mão do jogador
	maoJogador.add("tresEspadas");//Adicionando cartas à mão do jogador
	maoJogador.add("asPaus");//Adicionando cartas à mão do jogador
	maoJogador.add("damaPaus");//Adicionando cartas à mão do jogador
	maoJogador.add("reiPaus");//Adicionando cartas à mão do jogador
	
	
	setMaximumSize(new Dimension(0, 0));
	setMinimumSize(new Dimension(850, 700));
	setVisible(true);
	setBounds(100, 100, 450, 300);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	getContentPane().setLayout(null);
	
	JPanel panel = new JPanel();
	panel.setOpaque(false);
	panel.setBounds(10, 618, 783, 33);
	getContentPane().add(panel);
	
	JButton descartar = new JButton("Descartar");
	descartar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			maoJogador.remove(maoJogador.get(0));
			lista.remove(lista.get(0));
		}
		
	});
	repaint();
	descartar.setHorizontalTextPosition(SwingConstants.CENTER);
	panel.add(descartar);
	
	JButton pegarCarta = new JButton("Pegar carta");
	panel.add(pegarCarta);
	
	JButton embaralhar = new JButton("Embaralhar");
	panel.add(embaralhar);
	
	JPanel mao = new JPanel();
	mao.setLayout(new FlowLayout());
	mao.setOpaque(false);
	mao.setBounds(10, 486, 783, 125);
	
	getContentPane().add(mao);
	
	
	JLabel imagemMesa = new JLabel("");
	imagemMesa.setBounds(0, 186, 808, 476);
	getContentPane().add(imagemMesa);
	imagemMesa.setIcon(new ImageIcon(GUITelaJogo.class.getResource("/ifpb/monteiro/p2/projetoFinal/imagens/mesa.png")));
	imagemMesa.setPreferredSize(new Dimension(988, 142));
	imagemMesa.setOpaque(false);
	imagemMesa.setMinimumSize(new Dimension(988, 142));
	imagemMesa.setMaximumSize(new Dimension(988, 289));
	
	JButton btnNewButton_3 = new JButton("Sair");
	btnNewButton_3.setBounds(704, 622, 89, 23);
	getContentPane().add(btnNewButton_3);

// Mao.add(imagemMao);

	/* Início código mão jogador */

	

	String caminho = "./imagens/cartas/"; 	//Caminho onde estão as cartas
	ImageIcon icon;

	
	/* Percorre o arraylist com nome das cartas('maoJogador'), joga o caminho completo em icon e adiciona a carta ao arraylist de imagens('lista')*/
	for (String carta : maoJogador) {
		icon = new ImageIcon(caminho+carta+".gif");
		lista.add(icon);
	}		

	for (int i = 0; i < lista.size(); i++) {/* Para cada imagem na lista de imagens, o label receberá as imagens. */
		JLabel imagemMao = new JLabel("");
		imagemMao.setIcon(new ImageIcon(testeGUI.class.getResource(lista.get(i).toString())));
		mao.add(imagemMao);
	}

	/* Fim código mão jogador */

}

}[/code]

Obrigado.

Olá, dei uma modificada no código e agora ao invés de imagens estáticas, as cartas são botões que facilitarão muito o trabalho. A dúvida continua a mesma: quando eu clicar em um botão para descartar ou pegar carta (remover ou adicionar elementos da lista, respectivamente), como atualizar a representação dessas cartas na tela do jogo? O código modificado segue abaixo:


package ifpb.monteiro.p2.projetoFinal;

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import java.awt.FlowLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GUITelaJogo extends JFrame {

	public ArrayList<String> maoJogador = new ArrayList<>(); // Arraylist com o nome que o jogador terá na mão.
	JButton btnCartas = null;
	JPanel mao = null;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GUITelaJogo frame = new GUITelaJogo();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame. 
	 */
	public GUITelaJogo() {

		maoJogador.add("asPaus");	//Adicionando cartas à mão do jogador
		maoJogador.add("doisOuro");	//Adicionando cartas à mão do jogador
		maoJogador.add("tresEspadas");//Adicionando cartas à mão do jogador
		maoJogador.add("asPaus");//Adicionando cartas à mão do jogador
		maoJogador.add("damaPaus");//Adicionando cartas à mão do jogador
		maoJogador.add("reiPaus");//Adicionando cartas à mão do jogador
		maoJogador.add("setePaus");//Adicionando cartas à mão do jogador
		maoJogador.add("valetePaus");//Adicionando cartas à mão do jogador

		JLabel labelChat = new JLabel("");
		labelChat.setBounds(803, 382, 215, 279);
		labelChat.setVisible(true);
		getContentPane().add(labelChat);
		
		setResizable(false);		
		setMaximumSize(new Dimension(0, 0));
		setMinimumSize(new Dimension(1024, 700));
		setBounds(100, 100, 450, 300);
		setLocationRelativeTo(null);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);
		setTitle("Jogos de cartas");
		

		JPanel panel = new JPanel();
		panel.setOpaque(false);
		panel.setBounds(609, 630, 179, 33);
		//		labelChat.add(new Chat());
		getContentPane().add(panel);

		JButton descartar = new JButton("Cr\u00E9ditos");
		descartar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});

		descartar.setHorizontalTextPosition(SwingConstants.CENTER);
		panel.add(descartar);
		JButton pegarCarta = new JButton("Sair");
		pegarCarta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(JOptionPane.showConfirmDialog(null, "Deseja realmente sair?") == 0){
					System.exit(0);	
				}else{}
			}
		});
		panel.add(pegarCarta);
		mao = new JPanel();
		mao.setLayout(new FlowLayout());
		mao.setOpaque(false);
		mao.setBounds(10, 477, 783, 142);
		getContentPane().add(mao);
		JLabel imagemMesa = new JLabel("");
		imagemMesa.setBounds(0, 196, 793, 476);
		getContentPane().add(imagemMesa);
		imagemMesa.setIcon(new ImageIcon(GUITelaJogo.class.getResource("/ifpb/monteiro/p2/projetoFinal/imagens/mesa.png")));
		imagemMesa.setPreferredSize(new Dimension(988, 142));
		imagemMesa.setOpaque(false);
		imagemMesa.setMinimumSize(new Dimension(988, 142));
		imagemMesa.setMaximumSize(new Dimension(988, 289));

		/* Início código mão jogador */
		ArrayList<ImageIcon> lista = new ArrayList<>(); //Arraylista que conterá as cartas(objeto) que tem na mão do jogador*/
		String caminho = "./imagens/cartas/"; 	//Caminho onde estão as cartas
		ImageIcon icon = null;

		/* Percorre o arraylist com nome das cartas('maoJogador'), joga o caminho completo em icon e adiciona a carta ao arraylist de imagens('lista')*/
		for (String carta : maoJogador) {
			icon = new ImageIcon(caminho+carta+".gif");
			lista.add(icon);
		}		

		for (int i = 0; i < lista.size(); i++) {/* Para cada imagem na lista de imagens, o label receberá as imagens. */
			btnCartas = new JButton();
			btnCartas.setPreferredSize(new Dimension(90,127));
			btnCartas.setIcon(new ImageIcon(testeGUI.class.getResource(lista.get(i).toString())));
			mao.add(btnCartas);
		}
		/* Fim código mão jogador */

	}//Fim GUITelaJogo()

}//Fim classe

Obrigado!

Pessoal, apesar de tudo não deu tempo de terminar o jogo como eu queria e nem a tempo de terminar pra nota, mas o bom é que deu pra passar! :slight_smile:

Mesmo que não tenha terminado, consegui resolver a parte de atualizar as cartas depois de eu ter clicado nelas e vou postar aqui:

No finalzinho do código, onde tem as estruturas “for”, eu passei-as para dentro de um método para ficar mais fácil de invocá-las futuramente. E, no inicio do método, apliquei um .removeAll() no Jlabel que continha a mão de cartas. Dessa forma, quando eu clicava em uma carta(JButton), o método abaixo era chamado, excluindo o elemento que eu clicava do ArrayList e, em seguida, redesenhava na tela as cartas da lista, atualizadas!

No fim, o método ficou assim:


void chamaCartas() {
		mao.removeAll(); // Limpa todos os elementos que estiverem dentro do JPanel.
		for (int i = 0; i < listaPlayer.size(); i++) {	/* Para cada imagem na lista de imagens, o JLabel receberá as imagens. */

			btnCartas = new JButton();
			btnCartas.setName(maoJogador.get(i));
			btnCartas.addActionListener(this);
			btnCartas.setLayout(new FlowLayout());
			btnCartas.setBounds(50, 50, 90, 126);
			btnCartas.setPreferredSize(new Dimension(90,127));
			btnCartas.setBackground(new Color(0,0,0,0));
			btnCartas.setIcon(new ImageIcon(GUITelaJogo.class.getResource(listaPlayer.get(i).toString())));
			mao.add(btnCartas);
               }

	} 

Estou postando pra o caso de alguém precisar de algo parecido um dia!

Boa sorte a todos em seus projetos!