JLayeredPane z LayoutManager
Sytuacja: losowanie stosu kart do gry, jak w grze Solitaire. Ładnie ułożone.
Aby to osiągnąć, używamJLayeredPane
w połączeniu z niestandardową implementacjąLayoutManager
berło. Powodem używania niestandardowego LayoutManager jest to, że orientacja stosu jest różna, czasami karty do gry pokrywają się całkowicie, czasem częściowo, i ta logika wydaje się być dobrą robotą dla LayoutManagera, ponieważ zasadniczo sprowadza się to do ustawienia lokalizacji karty.
Tak więcLayoutManager
jest odpowiedzialny za ustawienie współrzędnych X i Y wszystkich komponentów w moim stosie. TheJLayeredPane
z drugiej strony jest odpowiedzialny za swoje współrzędne Z (poprzez swoje warstwy).
Dodawanie komponentu do aJLayeredPane
w ten sposób:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
gdzienew Integer(j)
jest warstwą karty. To musi byćInteger
ze względu na umowę zJLayeredPane
.
Problem polega na tym, że mójStackLayout
nie może mieć żadnego innego obiektu ograniczenia niżInteger
, z powodu wskazanego powyżej. TheLayoutManager
interfejs wymaga wdrożenia następującej metody:
addLayoutComponent(Component comp, Object constraints);
i minąłObject
zawsze będzie tutajInteger
.
W mojej szczególnej sytuacji mam szczęście, ponieważ moje współrzędne XY można obliczyć na podstawie współrzędnych Z. Na przykład karta w warstwiek
musi być umieszczony w współrzędnej Y.k * offset
. Tak więc w mojej sytuacji obiekt ograniczeń jestInteger
to nie problem.
Zastanawiałem się, co powinieneś robić, gdy nie ma korelacji między współrzędnymi Z i współrzędnymi XY? Jak możesz to rozwiązać? Na przykład, jak bym użyłGridBagLayout
w połączeniu z aJLayeredPane
, gdzie pierwszy wymagaGridBagConstraints
obiekt i drugi anInteger
obiekt? Oczywiście GBL będzie układać się w taki sposób, że komponenty nie będą się nakładać, ale to tylko pomysł.