# Bilder überlappen



## Java123??? (18. Feb 2011)

Guten morgen,
ich habe mir ein paar JLabels erstellt, wo ich mit setIcon Bilder anzeigen lasse.
Mit addGap habe ich bisher die Positionierung angepasst:

```
.addGroup([..])
.addComponent(component)
.addGap(0,0,0)
```
Allerdings ist es nicht möglich dort negativ Werte anzugeben.

Wie kann ich dann die Bilder überlappen lassen?


----------



## Michael... (18. Feb 2011)

Eine Möglichkeit wäre die Bilder direkt auf der Komponente in gewünschter Position zeichnen zulassen.
Wenn der Umweg über JLabel beleiben soll, könnte man dem Container ein sogn. Null-Layout verpassen, damit könnte man die Labels beliebig absolut positionieren.


----------



## Blakh (18. Feb 2011)

Hallo,
entweder du zeichnest deine Bilder selbst und lässt sie so überlappen:


```
ImageIcon graphic = new ImageIcon(fileUrl);
		
graphic .paintIcon(component, graphics, x, y)
```

oder du verwendest JLayeredPane:

How to Use Layered Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Java123??? (18. Feb 2011)

Ich hab es jetzt so probiert:


```
ImageIcon graphic = new ImageIcon(fileUrl);
        
graphic .paintIcon(this, getGraphics, 10, 10);
```

Ich glaube i-wo hab ich da noch ein Denkfehler. Ich bekomme zwar keine Fehlermeldung aber das Bild wird auch nicht angezeigt.
Wo ist der Fehler?

Mfg


----------



## Blakh (18. Feb 2011)

Zeig doch ml ein wenig mehr von deinem Code. Wo zeichnest du das etc.


----------



## Java123??? (18. Feb 2011)

```
public class Oberflaeche extends javax.swing.JFrame {
   public Oberflaeche() {
      init();
   }
   private void init() {
      setDefaultCloseOperation(javax.swingWindowConstants.EXIT_ON_CLOSE);
      setMinimumSize(new javax.awt.Dimension(1000, 700));

      ImageIcon testIcon= Icons.getIcon("");
      testIcon.paintIcon(this, getGraphics(), 10, 10);
   }
}
```
So hier bekomme ich eine NullPointerException in der Zeile 10.


----------



## Blakh (18. Feb 2011)

```
Icons.getIcon("");
```

Was ist denn Icons? Und wieso markiert deine IDE da nix. Du hast gar keine Variable die so heißt und eine Klasse, welche so heißt, kenn ich nicht. Auf alle Fälle liefert es null zurück und testGraphic.point() kracht da natürlich.


----------



## Java123??? (18. Feb 2011)

getIcon() ist eine statische Methode der Klasse Icons. Diese Methode gibt ein ImageIcon zurück. Auf jeden Fall glaub ich nicht dass hier der Fehler liegt, weil wenn ich:

```
ImageIcon testIcon = new ImageIcon(icon.gif);
```
benutze habe ich immer noch den gleichen Fehler.


----------



## Java123??? (18. Feb 2011)

Sorry, wenn ich es vergessen hab zu erwähnen die Klasse Icons gibt es natürlich nicht, die habe ich selbst erstellt, aber siehe meinen Post hierfür, wenn ich diese nicht benutze habe ich den gleichen Fehler.


----------



## Blakh (18. Feb 2011)

Dann stimmt da meiner Meinung nach was mit dem Pfad nicht.

probier mal:


```
URL fileURL = getClass().getResource("icon.gif");
ImageIcon testIcon = new ImageIcon(fileURL);
```

Lege das Bild zu der Klassendatei, in welcher der Code ausgeführt wird.


----------



## Java123??? (18. Feb 2011)

Jetzt hab ich es so probiert:

```
URL fileURL = getClass().getResource("icon.gif");
ImageIcon testIcon = new ImageIcon(fileURL);
```
Dann bekomme ich ne Nullpointer in der 2.Zeile


----------



## Blakh (18. Feb 2011)

Gib mal den Pfad vom Bild und der Klassendatei bitte.


----------



## Java123??? (18. Feb 2011)

Als ich es vorher mit JLabel gemacht habe und dann setIcon hat es ja funktioniert.
Ich konnte nur die Bilder nicht überlappen lassen, also muss der Pfad doch richtig sein.

Klasse:
JavaProjects/src/GUI/Oberflaeche.java
Bild:
JavaProjects/icon.gif


----------



## Blakh (18. Feb 2011)

Nein ist er nicht.


```
URL fileURL = getClass().getResource("icon.gif");
```

Das funtkioniert meines Wissens in der Form nur, wenn das Bild und die Klassendatei im selben Ordner liegen. Mach as mal so und probier es aus.

Pfadangabe .getResource


----------



## Java123??? (18. Feb 2011)

Ok, du hattest Recht.

Auf jeden Fall hab ich jetzt wieder den Nullpointer wo ich ihn vorher auch hatte in Zeile 3

Hier nochmal der Code:

```
URL fileURL = getClass().getResource("icon.gif");
ImageIcon testIcon = new ImageIcon(fileURL);
testIcon.paintIcon(this, getGraphics(), 10, 10);
```


----------



## Blakh (18. Feb 2011)

Lass dir doch mal die URL ausgeben, überprüfe per:


```
if (testIcon == null)
```

ob das Image da ist. Dann bleibt ja nur noch das getGraphics noch nichts zurückliefert. Deshalb verwendet man immer Folgendes:


```
@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		testGraphic.paintIcon(this, g, 0, 0);

	}
```

Diese Methode wird beim Zeichnen der Komponente aufgerufen und du kannst das auch mit repaint(), veranlassen.


----------



## Java123??? (18. Feb 2011)

Also scheint wohl am Graphics zu liegen.

Hier nochmal der komplette Quellcode (wo soll ich da die Methode überschreiben? Irgendwie klappt das nämlich bei mir nicht):


```
package GUI;

import java.net.URL;
import javax.swing.ImageIcon;

public class Oberflaeche extends javax.swing.JFrame {
    public Oberflaeche() {
        init();
    }

    private void init() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(1000, 700));

        URL fileURL = getClass().getResource("icon.gif");
        ImageIcon testIcon = new ImageIcon(fileURL);
        if(testIcon == null) {
            System.out.println("testIcon - null");
        }else{
            System.out.println("testIcon - " + testIcon.toString());
        }
        testIcon.paintIcon(this, getGraphics(), 10, 10);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Oberflaeche o = new Oberflaeche();
                o.setVisible(true);
            }
        });
    }
}
```
Ausgabe:
testIcon - file:/D:/JavaProjects/Connect/src/GUI/icon.gif
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GUI.Oberflaeche.init(Oberflaeche.java:23)​


----------



## Blakh (18. Feb 2011)

Musst ein Zeichenpanel aufs Frame setzen ... ich vergas  (JPanel)


```
package PaintTest;
 
import java.awt.Graphics;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
@SuppressWarnings("serial")
public class Oberflaeche extends JFrame {
 
    private ImageIcon testIcon;
 
    public Oberflaeche() {
        init();
    }
 
    private void init() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(1000, 700));
 
        URL fileURL = getClass().getResource("icon.gif");
        testIcon = new ImageIcon(fileURL);
        add(new MyPanel());
    }
 
  
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Oberflaeche o = new Oberflaeche();
                o.setVisible(true);
            }
        });
    }
    
	/****************************************************************
	 * Inner class
	 ****************************************************************/
    
    class MyPanel extends JPanel {
    	
    	  @Override
    	    protected void paintComponent(Graphics g) {
    	        super.paintComponent(g);
    	        
    	        testIcon.paintIcon(this, g, 10, 10);
    	 
    	    }
    }
}
```


----------



## Java123??? (18. Feb 2011)

Perfekt, danke es funktioniert.
Habe meinen Quellcode jetzt so angepasst, wie du es gepostet hast und jetzt kann ich die Bilder sogar überlappen lassen.

Vielen Dank Blakh
Mfg


----------

