Consigo exibir Icon e Label numa janela, mas gostaria de definir em q posição na janela vão aparecer

Olá pessoal, não sou experiente em java, estou começando, e estou fazendo um jogo de cartas simples, a parte que controla o jogo me si está certa, porém toda em modo texto, sendo que substituirei a classe que exibe as os textos pela classe que pega as mesmas informações, mas ao invés de apartir das inforçoes geradas exibir um texto relatando, a classe que pegará essas informações e exibirá as cartas e textos(label) na tela.
A minha idéia é que as cartas estejam sempre lá, as do jogador computador no topo e as do jogador usuário embaixo, porém essas cartas estarão somente com seu espaço “alocado” nessas posiçoes(como se fossem dois Arrays) sendo que no decorrer do jogo os valores (da posição do array) serão alterados e as cartas também. Sendo assim, uma vez especificado onde fica o conjunto de cartas de cada jogador, as cartas que o jogador possui serão apenas alteradas. Pois bem, o meu problema é que não estou sabendo como fazer com que as cartas sejam inseridas na parte de baixo da janela e outras no topo. Em um teste que estou fazendo no qual clico em um botão e cartas são inseridas randomicamente, todas são inseridas logo à frente do botão e conforme a vão havendo muitas cartas elas vão aparecendo nas linhas de baixo, exatamente como acontece com um texto.
Gostaria de fazer com que elas aparecessem logo abaixo do botão e as do outro jogodaos na parte mais abaixo da janela e entre elas um Label informando pontos e outras coisas.
Como eu poderia fazer para que elas ficassem dispostas dessa maneira e o label entre elas? Sendo mais simples, gostaria de inserir uma figura no TOP outro Bottom e um label Entre, somente isso.
Alguém pode me dar uma dica?

Muito Obrigado pela atenção!

LuizRocha, fico muito grato pela ajuda, porém como meus conhecimentos não são muito avançados, apesar de ter entendido oque vc sugeriu, não consegui aplicar totalmente, de maneira a obter o resultado que eu queria.

Em meus testes anteriores eu criei um vetor tipo String contendo os nomes das cartas {“4c.png”,“2o.png”,…} e apartir desse vetor apenas testei para ver se eu conseguir fazer que a cada clique num botão, que eu creie, fosse sendo incrementado um contador que pegava a posição do vetor e mostrava a carta na tela.
Baseado neste teste que fiz e usando sua idéia, supondo que ao invés de 1, eu tenha 2 vetores com nomes das cartas do jogadorUsuario e do jogadorComputador. Como eu poderia fazer para que essas cartas fossem colocadas nos espaços alocados para cada jogador. Não entendi muito bem o seu último “bloco” de códigos, no qual, entre outras coisas, vc fala : " instancia cada JLabel com um ImageIcon ou algo assim ".

Obrigado pela atenção!!

Saudações.

Seria mais fácil de entender se tu mandasse uma figura com o rascunho do que tu quer e uma com a janela como ela está.

Se eu entendi o teu problema, tu quer dispôr na tua janela dois grupos de cartas com um tamanho específio, ocupando um certo lugar na janela (um grupo em cima e outro embaixo). Os espaços para as cartas já devem estar definidos mesmo que não estejam sendo ocupados por uma. Durante o decorrer do jogo, as cartas vão mudando de lugar (movimentação, adição/remoção de cartas ou algo assim). E o teu problema é que tu não sabe como fixar essas cartas a esses locais.

Esses grupos tem um tamanho fixo? A idéia é fazer espaços “alocados” parecidos com aqueles do FreeCell?

Caso a resposta a essas perguntas seja “sim”, a solução não é tão complicada. Na verdade, exitem várias maneiras de se resolver isso.
Minha primeira sugestão é que você estude as classes gerenciadoras de layout (“Layout Managers”). Elas organizam a posição dos componentes nas janelas.

Caso você já conheça alguns layout managers, minha segunda sugestão é usar um deles: o BorderLayout. É uma classe que divide o container (painel, etc) em cinco espaços: o norte, o sul, o leste, o oeste e o centro. O tamanho desses espaços pode variar, mas o centro sempre (ou quase) ocupa a maior área.
A idéia, então, seria pegar o painel principal da tua janela (ou o que tu tiver usando para dispôr a “mesa de cartas”) e definir o layout dele como um Border.

[code] JPanel meuPainel = new JPanel(new BorderLayout() ) ;
//ou pegue um painel e chame o método .setLayout(new BorderLayout() ) ;

//ou ainda, se a coisa for direto na janela, chame:
this.getContentPane().setLayout(new BorderLayout() ) ;
[/code]
Então você cria dois painéis - um para cada conjunto de cartas - e define o layout deles para um GridLayout, uma classe que divide o painel em linhas e colunas.

[code]JPanel pCartasComputador = new JPanel( new GridLayout( numLinhas, numColunas, espacoEntreLinhas, espacoEntreColunas) );
//Digamos que queiras espaço para 8 cartas:
JPanel pCartasComp = new JPanel( new GridLayout( 1, 8) );
//o espaço entre linhas e colunas é opcional

//copiamos para o painel do jogador.
JPanel pCartasJogador = pCartasComputador.clone();
[/code]
E aí coloca esses dois painéis no norte e no sul do painel definido como borderlayout

meuPainel.add("North",pCartasComputador);
meuPainel.add("South",pCartasJogador);

Agora você tem os espaços alocados, mas não tem nenhuma Label neles. A solução seria preencher cada célula dos painéis das cartas com uma posição do vetor de labels.
Exemplo: JLabel cartasComputador[] = new JLabel[8]; JLabel cartasJogador[] = new JLabel[8]; for(int i=0;i<8;i++){ //instancia cada JLabel com um ImageIcon ou algo assim } //coloca cada carta na sua posicao: for(int i=0;i<8;i++){ pCartasComputador.add(cartasComputador[ i ] ); // analogamente o mesmo para as cartas do jogador, mas com o painel pCartasJogador } //você poderia até usar o mesmo "for"
Agora cada célula contém um JLabel que exibe a figura de uma carta. A graça é que você não precisa mais manipular os painéis, basta mudar os valores dos labels que as figuras mudam.

Se você não entendeu bulhufas, procure ler sobre layoutmanagers, esquina do Swing com awt. Leia também na documentação da API sobre os gerenciadores de layout que te interessarem. Neste caso eu usei o BorderLayout e o GridLayout.

É isso aí, rapaziada.
Boa sorte.

Tem mais uma coisa: o GridLayout divide o espaço que tiver disponível entre as linhas e as colunas que tu definiu. Assim, talvez o espaço reservado para as cartas fique maior do que elas. A solução seria usar no painel “gradeado” o método setPreferredSize(new Dimension(tamanhoX, tamanhoY) ) ; com os tamanhos x e y bem calulados. Se, depois disso, os conjuntos de cartas ficarem nos cantos - e não no centro - tente colocar os painéis gradeados dentro de outros painéis (um para cada painel gradeado - pCartasComputador e pCartasJogador) e colocar o layout desses novos painéis para new FlowLayout(FlowLayout.CENTER) - de modo que esses painéis que guardam os labels fiquem no centro dos novos painéis. Esses novos painéis, então, poderiam ser colocados no norte e no sul do borderlayout.

Isso mesmo, cara. Painéis também são componentes. Tu pode colocar painéis dentro de painéis até ficar do jeito que tu quer. Só toma cuidado pra não se perder!

Valeu.

Saudações.

Se eu não me engano, você pretende mostrar imagens das suas cartas na janela, não é? Então você pode usar a classe JLabel (label = rótulo em inglês). Ela serve para colocar no container algum texto pequeno ou alguma imagem. Por exemplo, se este fórum fosse feito usando as classes do pacote swing, aqueles nomes que você veria na hora de se logar (“Usuário:” e “Senha:”) seriam instâncias de JLabel. Na mesma hipótese, aqueles emoticons que aparecem para você colocar na sua mensagem quando você escreve também seriam objetos de JLabel, só que com figuras em vez de texto.

No seu teste, você fez um array de Strings contendo os nomes das cartas. Assim, do mesmo jeito, você poderia fazer um array de objetos da classe JLabel; contendo, cada um, uma figura que seria a carta. Mas, para fazer com que um label mostre uma figura em vez de um texto, você precisa mandar para o método construtor de JLabel um objeto de ImageIcon. Tal objeto é o que verdadeiramente guarda a imagem, enquanto o JLabel apenas a exibe na tela.

Para instanciar um JLabel com um ImageIcon você faria:

ImageIcon figuraAs = new ImageIcon("img/as.JPG"); JLabel cartaAs = new JLabel(figuraAs);
Ou simplesmente

Assim, quando você adicionasse esse label em algum lugar da sua janela, ele exibiria a figura as.JPG, que estaria na pasta img - e esta, por sua vez, estaria na mesma pasta da classe onde está esse código; ou melhor, do arquivo “.class” dela.

Além disso, você pode mudar a imagem que um JLabel exibe usando o método setIcon:

ImageIcon cartaCoringa = new ImageIcon("img/coringa.JPG"); cartaAs.setIcon(cartaCoringa);

A idéia que eu sugeri é ter uma imagem para cada carta, todas guardadas num diretório da tua escolha. Depois, você poderia separar o espaço na sua janela criando dois containers - de preferência, dois objetos da classe JLabel - cujo gerenciador de layout de ambas fosse um GridLayout, que criaria células de acordo com o número de linhas e colunas que você mandasse para o seu método construtor. Então, para cada célula, você criaria um objeto de JLabel, que seria o responsável por exibir a imagem de uma carta. Você poderia ter um array de objetos de ImageIcon - um para cada imagem da sua pasta - de modo que esses objetos seriam as figuras das suas cartas. Ao final, você instanciaria os seus JLabels com os objetos de ImageIcon que você fez e os adicionaria aos painéis que você fez.

Pra te ajudar, coloco aqui um exemplo simples, mas completo:


import javax.swing.*;
import java.awt.*;

public class MeuFrame extends JFrame {

	private Container c;
	private ImageIcon figCartaJogador[];
	private ImageIcon figCartaComputador[];
	private JPanel painelCartasJogador;
	private JPanel painelCartasComputador;
	private JLabel labelCartaJogador[];
	private JLabel labelCartaComputador[];
	
	public MeuFrame(){
		this.setTitle("Teste");
		c = this.getContentPane();//o gerenciador de layout padrao eh BorderLayout
		/*
		 * Criando paineis
		 */
		painelCartasJogador = new JPanel();
		painelCartasJogador.setLayout(new GridLayout(1,7));//uma linha, sete col.
		painelCartasComputador = new JPanel(new GridLayout(1,7));
		// ou, simplesmente:
		// painelCartasComputador = painelCartasJogador.clone();
		
		/*
		 * Criando imagens
		 */
		this.figCartaJogador=new ImageIcon[20];//vinte cartas
		this.figCartaComputador=new ImageIcon[20];
		for(int i=0;i<figCartaJogador.length;i++){
			//supoe-se que voce tenha essas imagens:
			figCartaJogador[i]=new ImageIcon("imagens/CJN"+i+".JPG");
			figCartaComputador[i]=new ImageIcon("imagens/CCN"+i+".JPG");
			//obs: CJN=cartaJogadorNumero e CCN=cartaComputadorNumero
		}
		/*
		 * Criando labels
		 */
		this.labelCartaJogador=new JLabel[7];//exibe 7 cartas
		this.labelCartaComputador=labelCartaJogador.clone();
		for(int i=0;i<labelCartaJogador.length;i++){
			//instancia com as primeiras 7 cartas de cada "time"
			labelCartaJogador[i]=new JLabel(figCartaJogador[i]);
			labelCartaComputador[i]=new JLabel(figCartaComputador[i]);
		}
		/*
		 * Colocando as coisas nos seus devidos lugares
		 */
		//adicionando labels ao painel do computador
		for(int i=0;i<7;i++){
			//um label para cada uma das 7 celulas de cada painel
			painelCartasComputador.add(labelCartaComputador[i]);
			painelCartasJogador.add(labelCartaJogador[i]);
		}
		c.add("North",this.painelCartasComputador);
		c.add("South",this.painelCartasJogador);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MeuFrame mf = new MeuFrame();
		mf.setVisible(true);
	}
        /**
         * Troca a carta exibida no JLabel pela identidicada por nImagem. Ambos os numeros representam 
         * a posicao que o objeto ocupa no seu respectivo array. Cuidado com numeros invalidos.
         */
        public void mudarCartaJogador(int nLabel, int nImagem){
                this.labelCartaJogador[nLabel].setIcon(this.figCartaJogador[nImagem]);
        }
        //algo similar seria feito para as cartas do computador.

}

Espero ter ajudado.