The situation: drawing a stack of playing cards, like in the Solitaire game. Nicely stacked.
To achieve this, I'm using a JLayeredPane
in combination with a custom implementation of the LayoutManager
interface. The reason for using a custom LayoutManager is that the stack orientation varies, sometimes the playing cards cover each other completely, sometimes partially, and this logic seems to be a good job for a LayoutManager, because this basically boils down to setting the location of the cards.
So, the LayoutManager
is responsible for setting the X- and Y-coordinates of all components in my stack. The JLayeredPane
on the other hand is responsible for their Z-coordinates (via its layers).
Adding a component to a JLayeredPane
goes like this:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
where new Integer(j)
is the layer of the card. This must be an Integer
due to the contract of JLayeredPane
.
The problem here is, that my StackLayout
cannot have any other constraint object than an Integer
, due to the reason stated above. The LayoutManager
interface requires you to implement the following method:
addLayoutComponent(Component comp, Object constraints);
and the passed Object
will here always be an Integer
.
In my particular situation, I am lucky, as my XY-coordinates can be calculated based on the Z-coordinates. For example, the card in layer k
has to be located at Y-coordinate k * offset
. So in my situation, the constraints object being an Integer
is not a problem.
I was wondering what you should be doing when there is no correlation between the Z-coordinates and the XY-coordinates? How can you solve this then? For example, how would I use a GridBagLayout
in combination with a JLayeredPane
, where the first requires a GridBagConstraints
object and the second an Integer
object? Of course, a GBL will layout in such a way that components do not overlap, but it's just the idea.
protected void addImpl(Component comp, Object constraints, int index)
whichJLayeredPane
overrides itself, to intercept theInteger
object first which is used for layer determination. Then it passes on the constraints to its super class,Container
, which ultimately won't do anything with it as a defaultJLayeredPane
has no LayoutManager. I will write an answer for this approach. – Noleta