JLayeredPane con un LayoutManager
La situación: dibujar una pila de cartas, como en el juego Solitario. Muy bien apilados.
Para lograr esto, estoy usando unJLayeredPane
en combinación con una implementación personalizada de laLayoutManager
interfaz. La razón para usar un LayoutManager personalizado es que la orientación de la pila varía, a veces las cartas se cubren entre sí completamente, a veces parcialmente, y esta lógica parece ser un buen trabajo para un LayoutManager, porque básicamente se reduce a configurar la ubicación de la tarjetas
Entonces elLayoutManager
es responsable de configurar las coordenadas X e Y de todos los componentes en mi pila. losJLayeredPane
por otro lado es responsable de sus coordenadas Z (a través de sus capas).
Añadiendo un componente a unJLayeredPane
va así:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
dóndenew Integer(j)
Es la capa de la carta. Esto debe ser unInteger
debido al contrato deJLayeredPane
.
El problema aquí es que miStackLayout
no puede tener ningún otro objeto de restricción que unInteger
, por el motivo expuesto anteriormente. losLayoutManager
La interfaz requiere que implementes el siguiente método:
addLayoutComponent(Component comp, Object constraints);
y el pasadoObject
aquí siempre habrá unaInteger
.
En mi situación particular, tengo suerte, ya que mis coordenadas XY se pueden calcular en base a las coordenadas Z. Por ejemplo, la tarjeta en capa.k
tiene que estar ubicado en la coordenada Yk * offset
. Así que en mi situación, el objeto de restricciones es unInteger
no es un problema.
Me preguntaba qué debería hacer cuando no hay una correlación entre las coordenadas Z y las coordenadas XY. ¿Cómo puedes resolver esto entonces? Por ejemplo, ¿cómo usaría unGridBagLayout
en combinación con unJLayeredPane
, donde el primero requiere unGridBagConstraints
objeto y el segundo unInteger
¿objeto? Por supuesto, un GBL diseñará de tal manera que los componentes no se superpongan, pero es solo la idea.