Überlappende Elemente, JButton zwängt sich in den Vordergrund

greggy80

Mitglied
Hallo zusammen,

vielleicht auch wieder nur ein sehr dummer Fehler, aber momentan habe ich ein Brett vorm Kopf.

Im Anhang findet ihr einen Screenshot einer GUI, in der ein paar Buttons und insbesondere ein überlappendes JPanel zu sehen sind. Wie unschwer erkennbar, drängen sich die Buttons jedoch in den Vordergrund - spätestens, wenn man einen MouseOver über einen halb verdeckten Button macht.

Diese Anomalie tritt auf, obwohl ich einen JLayeredPane einsetze, der ein JPanel mit den Buttons und einen JPanel aufnimmt und entsprechend in z-Richtung anordnet:

Java:
//this ist ein JFrame
this.setLayout(null);
JLayeredPane lp = new JLayeredPane();
lp.setBounds(0, 0, screenSize.width, screenSize.height);
this.getContentPane().add(lp);

panBaseDisplay = new JPanel();
panBaseDisplay.setBounds(0, 0, screenSize.width, screenSize.height);

panOverlayDisplay = new JPanel();
panOverlayDisplay.setBounds(...);

lp.add(panBaseDisplay, JLayeredPane.DEFAULT_LAYER.intValue());
lp.add(panOverlayDisplay, JLayeredPane.DEFAULT_LAYER.intValue() + 100);

Kennt jemand den Grund, warum die Buttons nach vorne gesetzt werden? In einem Trivial-Beispiel klappt es auch, dass ich die Buttons hinter ein JPanel setze. Gibt es vielleicht irgendetwas wichtiges zu beachten - irgendeine Anomalie, die Swing so mit sich bringt?

Bin für jede Hilfe dankbar!

Viele Grüße,
David
 

Anhänge

  • screenshot.jpg
    screenshot.jpg
    28,3 KB · Aufrufe: 39
Zuletzt bearbeitet:
Musst du das Null-Layout verwenden? gibt es nicht einen anderen Layoutmanager, der deinen Wünschen einigermaßen gerecht wird?

Erstmal vielen Dank für den jxlayer-Tipp.

Den Layout-Manager hatte ich inzwischen wieder geändert, das war nur ein Test, ob sich dadurch irgendetwas tut. Ist inzwischen BorderLayout; passt.

Ich habe gestern insgesamt drei Stunden weiterprobiert, alles nochmal von vorne angefangen. Es klappte irgendwann, jedoch ist der Code beinah der gleiche geblieben. Der Vollständigkeit wegen:

Java:
//Fill panBaseDisplay and panOverlayDisplay

layeredPane.add(panOverlayDisplay, JLayeredPane.MODAL_LAYER);
layeredPane.add(panBaseDisplay, JLayeredPane.DEFAULT_LAYER);
		
getContentPane().add(layeredPane, BorderLayout.CENTER);

Der wesentliche Unterschied besteht darin, dass ich MODAL_LAYER und DEFAULT_LAYER verwende (wobei das ja eigentlich keinen Unterschied machen darf zur oben genannten Variante... oder?
Darüber hinaus füge ich das panOverlayDisplay VOR dem panBaseDisplay hinzu (anders als in meinem obigen Beitrag).

Weiß der Geier, warum es nicht geklappt hat.

Noch eine andere Geschichte: die Komponenten unterhalb des panOverlayDisplay's im panBaseDisplay reagieren weiterhin auf die MouseEvents (also auch vollständig unter dem panOverlayDisplay angeordnete Komponenten). Kann man das irgendwie abstellen? Momentan mache ich einen Workaround, indem ich alle Komponenten in panBaseDisplay deaktiviere.

Java:
private void enableComponents(Container c, boolean enabled)
{
    for (Component comp : c.getComponents())
    {
        if (comp instanceof Container)
        {
            enableComponents((Container)comp, enabled);
        }
        comp.setEnabled(enabled);
    }
}
 
Zurück