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.