# Bilder übereinanderlegen



## kor (5. Mai 2012)

Hallo

Ich möchte folgendes realisieren:

Über ein BufferedImage möchte ich ein zweites BufferedImage darüberlegen, das bis auf ein paar linien Transparent ist. Ziel ist es das teile des ersten Bildes durch das darüberliegende markiert werden. Diese Markierungen kann der Benutzer verschieben, darum möchte ich zwei getrennte Bilder haben.
das ganze soll in ein JPanel eingebettet werden. Ist es überhaubt möglich 2 Bilder übereinander darzustellen?

Hat jemand damit erfahrung bzw. tipps?

Lg


----------



## bERt0r (5. Mai 2012)

Die paintComponent Methode überschreiben und nacheinander die 2 Bilder malen. Guck dir das Zeichnen in Swing tutorial an.


----------



## Guybrush Threepwood (5. Mai 2012)

Die paintComponent-Methode muss nicht überschrieben werden, schließlich handelt es sich bei der Aufgabenstellung (noch) nicht um eine GUI-Komponente. Hier ein Code-Beispiel (Datentypeb müssen halt angepasst werden):


```
public static VolatileImage combineImage(VolatileImage background,
			BufferedImage foreground, int width, int height) {
		

		try {
			VolatileImage vimage = createVolatileImage(width, height,
					Transparency.OPAQUE);

//ab hier wird es interessant
			Graphics2D g = null;
			g = vimage.createGraphics();
			g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			g.drawImage(background, 0, 0, width, height, null);
			g.drawImage(foreground, 0, 0, width, height, null);
			g.dispose();
			return vimage;
		} catch(Exception e) {
			return null;
		}

		
	}
```


----------



## Guybrush Threepwood (6. Mai 2012)

Ups, hatte das JPanel im ersten Post überlesen. Das Überschreiben der paintComponent - wie von bert0r vorgeschlagen - wäre dann die Beste Lösung. Das Zeichnen kann analog zum Code-Beispiel erfolgen.


----------



## irgendjemand (7. Mai 2012)

man kann sichs auch ETWAS einfacher machen

zwei JLabel in die die bilder geladen werden ... mit setOpaque() transparent machen ... und mit einem JLayeredPane übereinander legen ...


----------



## kor (8. Mai 2012)

hi

Erstmal danke an alle Antworten. Ich habe es jetzt mit einem JLayeredPane und labels realisiert.
jetzt habe ich aber noch eine frage

In einer Klassenfunktion führe ich auf Knopfdruck volgende Funktionen aus.

```
gui.cmd.original= ImageIO.read(programm_dir1)
gui.Spektrum.removeAll();					
EigenImage BildSpektrum = new EigenImage(gui.cmd.original);
gui.Spektrum.add(BildSpektrum);
```

d.h. Ich erzeuge eine Klasse EigenImage und lege die auf meine gui.
Wass pasiert wenn diese befehle öfter ausgeführt werden (bei jedem Tastendruck)? Habe ich dann mehrere EigenImages die Übereinandergelegt werden oder werden die Objekte bei "gui.Spektrum.removeAll();" gelöscht?. 

Lg


----------



## bERt0r (8. Mai 2012)

Woher sollen wir wissen was deine Funktion removeAll in deiner Klasse/deinem Objekt Spektrum macht? Jedenfalls erzeugt ImageIO.read immer ein neues BufferedImage.


----------



## kor (8. Mai 2012)

hi

sorry war etwas unkongret.
gui.Spektrum ist ein JPanel und removeAll() die ganz normale Funktion die die Klasse JPanels zur Verfügung stellt. 
Werden Objekte am ende des Blocks zerstört so wie bei c und was ist mit objekten denen ein anderes zugewiesen wird (by referenz) und das 2te (referenz) objekt wird dann zerstört?

Lg


----------



## bERt0r (8. Mai 2012)

Zerstört wird in Java gar nix. RemoveAll macht genau das, was der name implizert und zwar werden alle Komponenten die sich auf dem JPanel befinden entfernt. Entfernt heißt nicht zerbombt und gelöscht sondern einfach nicht mehr auf dem JPanel gespeichert. Es ist aber durchaus möglich, dass eine Komponente die du durch removeAll gelöscht hast noch irgendwo anders relevant ist.
Java löscht nur Objekte, die nicht mehr referenziert werden, das heißt Objekte die keiner mehr kennt. Ob und wann ein Objekt gelöscht wird oder wurder kann man nur schwer sagen bzw. beeinflussen. Wenn man aber sauber programmiert ist das eigentlich kein Thema. Nicht sauber wäre es z.B wenn deine 4 Zeilen code bei dir in der paintComponent Methode stehen.


----------



## kor (9. Mai 2012)

hi

ok danke.

Jtzt habe ich noch ein anliegen bezwecks MouseMoion Listener.
Ich habe einen MouseAdapter mit MouseMotionListener implementiert

```
public class MyMouseAdapter extends MouseAdapter implements MouseMotionListener{
	 protected Spectrometer gui;
	 private boolean MouseActive=false;
	 
	 
	    public MyMouseAdapter(Spectrometer gui) {
	      this.gui = gui;
	           
	    }
	public void aktivateMouse(boolean b){
		if(b==true){
			gui.Spektrum.addMouseMotionListener(this);
		}
		else{
			gui.Spektrum.removeMouseListener(this);
		}
    public void mouseDragged(MouseEvent e) {
	      	       
	        int point = gui.Spektrum.getMousePosition().y;
	        System.out.println("point: "+point);
	                
	     }
```
Ich will also durch aufrufen der funktion aktivateMouse(boolean b) den MouseMotionListener ein oder ausschalten. Das Einschalten funktioniert, aber "removeMouseListener(this);" funktioniert irgendwie nicht.

Lg


----------



## bERt0r (10. Mai 2012)

Oh du meine Güte. BITTE lies dir doch erstmal ein Tutorial durch wie man sowas wie einen Listener verwendet. Bei dir liegen so viele Verständnisfehler vor, die kann man dir übers Forum gar nicht erklären. Lesson: Writing Event Listeners (The Java™ Tutorials > Creating a GUI With JFC/Swing)


----------



## kor (10. Mai 2012)

hi

auf die gefahr hin, dass ich mich furchbar blamiere aber so weit weg war ich doch nicht. Ich habe meine implementierung durch "MouseInputAdapter implements MouseInputListener" ersetzt weil diese offensichtlich für Mouse events und bewegungen vorgesehen ist. Aber für die funktion ist das vollkommen egal. 
ich hatte nur einen Tippfehler und jetzt "gui.Spektrum.removeMouseListener(this);" durch "gui.Spektrum.removeMouse*Motion*Listener(this);" ersetzt und es funktioniert so wie ich es wollte.

Ich bin mir durchaus bewußt, dass ich java defizite habe und gerade bei Interfaces blicke ich nur bedingt durch. Dafür benütze ich java einfach zu selten.

danke für alle tipps und hilfestellungen, ich bin mir durchaus bewußt, dass so hobby-programmierer wie ich ganz schön nerven können 


Lg


----------

