JLayeredPane com um LayoutManager

A situação: desenhar uma pilha de cartas de baralho, como no jogo Solitaire. Bem empilhado.

Para conseguir isso, estou usando umJLayeredPane em combinação com uma implementação personalizada doLayoutManager interface. O motivo para usar um LayoutManager personalizado é que a orientação da pilha varia, algumas vezes as cartas de jogo se cobrem completamente, às vezes parcialmente, e essa lógica parece ser um bom trabalho para um LayoutManager, porque isso basicamente se resume a definir a localização do LayoutManager. cartões.

Então oLayoutManager é responsável por definir as coordenadas X e Y de todos os componentes da minha pilha. oJLayeredPane por outro lado é responsável por suas coordenadas Z (através de suas camadas).

Adicionando um componente a umJLayeredPane vai assim:

JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));

Ondenew Integer(j) é a camada do cartão. Este deve ser umInteger devido ao contrato deJLayeredPane.

O problema aqui é que meuStackLayout não pode ter qualquer outro objeto de restrição do que umInteger, devido à razão declarada acima. oLayoutManager interface requer que você implemente o seguinte método:

addLayoutComponent(Component comp, Object constraints);

e o passadoObject será sempre aqui umInteger.

Na minha situação particular, tenho sorte, pois minhas coordenadas XY podem ser calculadas com base nas coordenadas Z. Por exemplo, o cartão na camadak tem que estar localizado na coordenada Yk * offset. Então, na minha situação, o objeto de restrições sendo umInteger Não é um problema.

Eu queria saber o que você deveria fazer quando não há correlação entre as coordenadas Z e as coordenadas XY? Como você pode resolver isso então? Por exemplo, como eu usaria umaGridBagLayout em combinação com umJLayeredPane, onde o primeiro requer umGridBagConstraints objeto e o segundo umInteger objeto? É claro que um GBL será organizado de tal forma que os componentes não se sobreponham, mas é apenas a ideia.

questionAnswers(2)

yourAnswerToTheQuestion