Ok, chiaro (e sensato)
Questo succede per via una ottimizzazione sul painting. Tutti i componenti Swing, a partire da JComponent, hanno il metodo:
public boolean isOptimizedDrawingEnabled()
Se un componente fa restituire da questo metodo un true, vuole indicare che i suoi componenti contenuti NON si sovrapporranno e questo rende più efficiente il painting. Questo è lo scenario tipico/normale. E tra l'altro quello applicato dai principali layout manager (es. BorderLayout, FlowLayout ecc..) in cui i componenti di fatto non si possono sovrapporre.
JLayeredPane invece fa restituire false, perché è fatto apposta per stratificare componenti. Se vuoi usare un normale JPanel, puoi usarlo, basta che lo estendi e ridefinisci isOptimizedDrawingEnabled per restituire false. A quel punto non avverrà più il difetto che hai descritto.
E infine basta solo che ti ricordi che il primo componente aggiunto in un contenitore è quello che sta tecnicamente più sopra (z-order 0) e l'ultimo aggiunto quello più in fondo (z-order N).
Come alternative:
1) Appunto un JLayeredPane
2) Uso del custom painting per disegnare in modo arbitrario la tastiera (con immagini, primitive di disegno, ecc..) e chiaramente con un po' tutto da gestire riguardo eventi ecc... Questa è una soluzione ben più complessa.


Rispondi quotando