Swing Erst Components, dann Container zeichnen

xehpuk

Top Contributor
Hey!

Ich habe ein JPanel und möchte, dass erst der Hintergrund des JPanels, dann die Komponenten, die im JPanel liegen, und schließlich restliche Malarbeiten des JPanels gezeichnet werden. Wie stell ich das an?

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintChildrenFirst extends JFrame {
	public PaintChildrenFirst() {
		final JPanel panel = new JPanel() {
			private final int rect = 20;
			
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.WHITE);
				g.fillRect(getWidth() / 2 - rect / 2, getHeight() / 2 - rect / 2, rect, rect);
			}
		};
		panel.setBackground(Color.BLACK);
		final JPanel subPanel = new JPanel();
		subPanel.setBackground(Color.RED);
		panel.add(subPanel, BorderLayout.CENTER);
		getContentPane().add(panel);
		setSize(0, 75);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new PaintChildrenFirst().setVisible(true);
	}
}
Ist:
  1. Ebene: Schwarz
  2. Ebene: Weiß
  3. Ebene: Rot
Soll:
  1. Ebene: Schwarz
  2. Ebene: Rot
  3. Ebene: Weiß
 
Kann sein dass man in diesem Fall ausnahmsweise (!) paint überschreiben muss statt paintComponent, und in der überschriebenen Variante dann "paintComponent", paintChildren etc. geeignet auftrufen muss. Besser (sauberer) fände ich aber was in Richtung JLayeredPane, falls das passt....
 
Danke für den Tipp!

Java:
public void paint(Graphics g) {
	super.paint(g);
	// hier dann das Zeichnen auf der obersten Ebene
}
Das wird mir vorerst reichen. Wenn die Zeit kommt, schaue ich mir dann auch LayeredPanes an. 😉
 

Zurück
Oben