Quote Originariamente inviata da tr_gal Visualizza il messaggio
Devo fare la tastiera di un piano, e i tasti neri devono ovviamente rimanere in primo piano
Ok, chiaro (e sensato)

Quote Originariamente inviata da tr_gal Visualizza il messaggio
mentre ora se passo con il mouse su quelli del livello inferiore, di default, me li porta al livello superiore
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.