# zwei JLabels überlappen lassen



## Bruegge (8. Aug 2008)

Hallo, 

Ich benutze in meinem Programm JLabels um bilder in einer JFrame darzustellen. Jetzt möchte ich ein kleineres Bild über ein größeres zeichnen. Also habe ich ein JLabel mit dem großen bild und eins mit dem kleineren Bild. Wie kann ich diese nun überlappen? Ich muss dazu sagen das ich keinen LayoutManager benutze und die Position der Labels mit .setBounds(...); angebe. Hat jemand eine Idee wie dies zu machen ist? Oder wäre es einfacher/effizienter ein JDesktop zu benutzen, welches innerhalb der JFrame ist.

Vielen Dank,

Christian


----------



## Marco13 (8. Aug 2008)

Ja, wenn man einfach setBounds macht, ist eben noch nicht klar, welches Oben und welches Unten liegen soll. Aber eine http://java.sun.com/docs/books/tutorial/uiswing/components/layeredpane.html könnte das sein, was du brauchst.


----------



## Bruegge (8. Aug 2008)

Danke Marco, ich glaube das ist genau das was ich suche!


----------



## André Uhres (9. Aug 2008)

Auch ohne Layeredpane können wir eine Komponente nach oben bekommen:

```
setComponentZOrder(currentLabel, 0);
```


----------



## DieDreiJavas (30. Nov 2011)

Hallo!

Wir haben auch das Problem, dass wir ein Bild in einem JLabel haben und ein kleineres Bild darüberlegen wollen. 
Wir haben diesen Quellcode bekommen, aber wir steigen da leider nicht so gut durch...
Könnte das bitte jemand auskommentieren, sodass wir es verstehen? :rtfm:
Besonders wichtig ist für uns, an welcher Stelle der Punkt tatsächlich auf das Bild gezeichnet wird und wie auf das Bild zugegriffen wird? Weil das Bild in diesem Fall ja neu erstellt wird und wir das Bild, das darüber gelegt werden soll sowie den Hintergrund, schon haben. In unserem Fall ist es so, dass wir ein Spielfeld erstellt haben, bei dem jeder Spielstein in einem JLabel liegt und die Spielfigur (ein neues JLabel) über die einzelnen Spielfelder wandern können soll.

Vielen Dank schon mal für eure Hilfe! 

Quellcode:

```
package sonstiges;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Spielstein extends JLabel
{
	private Icon icon;

	public Spielstein(Icon icon)
	{
		super();
		this.icon = icon;
		if (icon != null)
		{
			setIcon(icon);
		}

	}

	public void paintComponent( Graphics g )
	{
		super.paintComponent(g);
		// ab hier eigene Malerei
		g.setColor(Color.RED);
		g.fillOval(15, 20, 10, 10);
	}

	// hier kommt nur noch die main-Methode zum Testen
	/**
	 * @param args
	 */
	public static void main( String[] args )
	{
		// TODO Auto-generated method stub
		JFrame beispiel = new JFrame("Beispiel");
		Icon dasBild = new ImageIcon("images/pferd.jpg");

		//Beispiellayout
		Container c = beispiel.getContentPane();
		c.setLayout(new GridLayout(3, 3));
		Spielstein s = new Spielstein(dasBild);
		c.add(s);
		
		// Fenstergroesse setzen
		beispiel.setSize(200, 200);
		// Fenster SChlieÃŸen bei x
		beispiel.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		// und anzeigen
		beispiel.setVisible(true);

	}

}
```


----------



## Michael... (30. Nov 2011)

Grundsätzlich tendiere ich bei solchen Spielchen eher alls selbst zu zeichnen, als da mit Komponenten was zusammen zu stellen.
In dem Beispielcode wird einfach nur ein normales JLabel erweitert/verwendet, da dies ja bereits Icons anzeigen kann. Um den Kreis darüber zu malen wird die paintComponent(Graphics) des JLabels überschrieben (ist die übliche Vorgehensweise um selbst zu zeichnen)
Der super Aufruf bewirkt letztendlich, dass das Icon gezeichnet wird (wie gesagt Standardroutine des JLabels) und im Anschluss wird mit fillOval(...) der Punkt darüber gemalt.
Wenn man mehrere Bilder in einer Komponente malen will, würde ich von JComponent/JPanel erben und ebenfalls die paintComponent(Graphics) überschreiben. Darin kann man dann mit dem Graphics Objekt per drawImage(...) die Bilder zeichnen lassen.


----------

