Überlagerung von meheren JPanels

Status
Nicht offen für weitere Antworten.

dastar

Mitglied
Moin,

Ich hab mich hier mal durchs Forum gesucht, aber auf meinen Fall find ich leider keine passende Antwort.
Ich will mehere JPanel übereinander legen. Das Problem ist nur, wenn ich ein Panel zeichnen lassen, dann verschwinden alle, die darunter liegen sollten.
Am besten ist immer ein Codebeispiel :

Diese Klasse soll ein Bild laden :
Code:
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javax.imageio.ImageIO;

class Grafik extends JPanel
{
	BufferedInputStream bis;
	BufferedImage bild;
	int x,y;
	   
	public Grafik(String pfad,int x,int y)
	{
		try
		{
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pfad));
			this.bild = ImageIO.read(bis);
		}
		catch(Exception e){}
		finally
		{
			this.x = x;
			this.y = y;
		}
	}
	   
	public void paintComponent(Graphics g)
	{
	        super.paintComponent(g);
	        g.drawImage(bild, x, y, this);
	}
	
	public int getRGB(int x,int y)
	{
		return this.bild.getRGB(x,y);
	}
}

Diese Klasse zeichnet einen Kreis :
Code:
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;

public class KreisAnzeige extends JPanel
{
	int xOrdinate,yOrdinate;
	int d = 20;
	String anzeige;
	   
	public ProvinzKreisAnzeige(int xOrdinate,int yOrdinate,int anzeige)
	{
		this.xOrdinate = xOrdinate;
		this.yOrdinate = yOrdinate;
		this.anzeige = ""+anzeige;
	}
	   
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.BLUE);		            
                g.fillOval(xOrdinate-(this.d/2),yOrdinate-(this.d/2),this.d,this.d);
	        g.setColor(Color.WHITE);
	        g.drawString(this.anzeige,xOrdinate-(this.anzeige.length()*3),yOrdinate+(this.d/2)-6);
	}
}

Die letzte Klasse lädt dann beide und malt sie auf ein JFrame
hier ein ausschnitt :

Code:
        ...
        mapPanel = new JPanel(new BorderLayout());
	map = new Grafik("map.gif",0,0);
	map_color = new Grafik("map_color.gif",0,0);
	map.addMouseListener(this);
	map.addMouseMotionListener(this);
	mapPanel.setComponentZOrder(map,0);
	mapPanel.add(map);	

	ProvinzKreisAnzeige anzeige = new ProvinzKreisAnzeige(30,30,22);
	mapPanel.setComponentZOrder(anzeige,1);
	mapPanel.add(anzeige);
			
	ProvinzKreisAnzeige anzeige2 = new ProvinzKreisAnzeige(130,130,999);
	mapPanel.setComponentZOrder(anzeige2,2);
	mapPanel.add(anzeige2);
		
	add(mapPanel, BorderLayout.CENTER);
        ...

den ganzen Code zu posten wär zu lang, aber das ist genau die Stelle an der es hakt.
es wird einfach immer nur die letzte Komponente gemalt. Ich habs auch schon mit LayeredPane probiert, kriegs aber
nicht hin.
Habt ihr ne Idee?
Kriegts jemand hin, das die JPanel alle zu sehn sind.

Vielen Dank schon mal.
 
Code:
mapPanel = new JPanel(new BorderLayout()); 
mapPanel.add(map);    
mapPanel.add(anzeige);
mapPanel.add(anzeige2);
Bei der Verwendung des BorderLayouts musst du auch angeben wo die Komponente geadded werden soll.
Zu beachten, an jeder Position (CENTER, SOUTH, WEST, NORTH, EAST) darf nur eine Komponente liegen.
Wenn du Komponenten tatsächlich übereinander liegen sollen, dann ist JLayeredPane der richtige Weg.
 
danke, aber wie schon gesagt ich habs mit JLayeredPane nicht hinbekommen.
Kannst du mir ein Codebeispiel geben, damit ich sehe wie ich mich da verrannt habe?
 
wenn ich das richtig verstehe muss ich diesen Teil verändern :

Code:
       ...
   mapPanel = new JPanel(new BorderLayout());
   map = new Grafik("map.gif",0,0);
   map_color = new Grafik("map_color.gif",0,0);
   map.addMouseListener(this);
   map.addMouseMotionListener(this);
   mapPanel.setComponentZOrder(map,0);
   mapPanel.add(map);   

   KreisAnzeige anzeige = new KreisAnzeige(30,30,22);
   mapPanel.setComponentZOrder(anzeige,1);
   mapPanel.add(anzeige);
         
   KreisAnzeige anzeige2 = new KreisAnzeige(130,130,999);
   mapPanel.setComponentZOrder(anzeige2,2);
   mapPanel.add(anzeige2);
      
   add(mapPanel, BorderLayout.CENTER);
        ...

nur hab ich keinen Plan wie
 
Hier mal ein Beispiel:
Code:
    public LayerPaneExample(){
        super("Gui");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel unten = new JLabel("unten");
        JLabel oben = new JLabel("oben");
        unten.setBackground(Color.RED);
        oben.setBackground(Color.BLUE);
        
        unten.setOpaque(true);
        oben.setOpaque(true);
        
        JLayeredPane pane = new JLayeredPane();
        pane.add(unten,1);
        pane.add(oben,0);
        add(pane);
        unten.setBounds(100,100,100,100);
        oben.setBounds(110,120,100,100);
        setVisible(true);

     }
 
Hab das jetzt mal ausprobiert (dein Beispiel funktioniert wunderbar)
und jetzt sind alle Grafiken nicht mehr zu sehen.

Der aktuelle Code :

Code:
mapPanel = new JLayeredPane();
map = new Grafik("map.gif",0,0);
KreisAnzeige anzeige = new KreisAnzeige(30,30,22);
mapPanel.add(map,1);
mapPanel.add(anzeige,0);
add(mapPanel);

woran kann das liegen, dass man da nix sieht?
alles andere wird ja komischerweise angezeigt...
 
Per Default hat eine JLayeredPane ein null Layout, d.h. du musst deinen Komponenten eine Größe und eine Position zuweisen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben