# Transparentes gif als extra Klasse auf einen JFrame zeichen



## Marce (22. Jul 2004)

Also ich habe folgendes Problem:

Ich hab ein JFrame auf dem ich ein Hintergrundbild lade (in der methode paint g.drawImage(...)).
Ich will nun über dieses Hintergundbild eine Figur bewegen, bzw. mehrere. Diese sollen extra Objekte sein (also eine extra Klasse) da ich die z.B. drehen will usw.
Mein Problem ist, dass ich nicht weiß wie ich diese Klasse auf den Frame bekomme - als JPanel oder so geht es nicht, da ich sonst keine Transparenz habe (Hintergundfarbe des Panels).
ICh habe schon einiges hier über die Klasse Canvas gelesen, bin aber nicht dahintergekommen, wie ich diese dann zeichen oder adden kann.

thx im vorraus Marce


----------



## bygones (22. Jul 2004)

schau mal hier : http://www.brackeen.com/javagamebook/
ich glaub im 2. kapitel macht er das gleiche


----------



## Marce (22. Jul 2004)

hm... ich werde mir den sourcecode mal ansehen - wobei ich wenig Hoffnung hab (bei dem was ich bereits gesehen hab) etwas brauchbares zu finden. Weil das auch recht viel und komplex ist.

Vielleicht nochmal mein Problem spezifiziert: mein Problem ist NICHT das Bild zu bewegen oder so, sondern lediglich wie ich mein Bild auf den Frame bekomme.
also ich habe eine Klasse:


```
import java.awt.*;
class Bild extends ????{
    Image i = Toolkit....(bild.bla...);
    public void Bild() {}
    
    public void paint(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(15, 15);
        g2d.rotate(4.71);
        g2d.translate( -15, -15);
        g2d.drawImage(i, 0, 0, this);
    }
}
```

wenn ich diese Klasse nun von JPanel ableite kann ich sie ganz normal mit 
	
	
	
	





```
contentPane.add(bild,null);
```
 hinzufügen, dann hab ich aber keine Transparenz.
Von Image kann ich sie nicht ableitren, da diese ja abstrakt definiert ist.

Ich brauche also eine Klasse von der ich meine ableiten kann, die ich dann auf dem Frame hinzufügen oder zeichen kann.

Falls ich in dem Code von dir was finde Poste ich es...


----------



## Grizzly (22. Jul 2004)

Marce hat gesagt.:
			
		

> [...]Ich brauche also eine Klasse von der ich meine ableiten kann, die ich dann auf dem Frame hinzufügen oder zeichen kann.[...]


Wenn Du mit der Swing arbeitest, heisst die Komponente Deiner Wahl _javax.swing.JComponent_. Arbeitest Du jedoch mit der AWT, heisst die Komponente _java.awt.Component_.


----------



## Marce (22. Jul 2004)

Ja, Danke! Das ist schon ein Stück voran. der erste Teil.

Jetzt habe ich aber immernoch das Problem, dass der Hintergrund meines Objektes weiß ist, bzw. eine Hintergrundfarbe hat. Wenn mein bild z.B. beine Kugel ist , wie bekomme ich es hin, dasss der Hintergrund meines Component auf dem Frame transparent ist?

/e ICh hab mal ein Bild angehängt: (das *.gif ist transparent, das weiße ist der Hintergrund des Component.


----------



## Grizzly (22. Jul 2004)

Versuch es mal mit setOpaque(boolean). Wenn Du 
	
	
	
	





```
setOpaque(true);
```
 setzt, müsste der Hintergrund Deiner Komponente transparent sein bzw. nicht gezeichnet werden.


----------



## Marce (22. Jul 2004)

DANKE!

ps: setOpaque(false) // ist durchsichtig


----------



## Grizzly (22. Jul 2004)

Marce hat gesagt.:
			
		

> DANKE!
> 
> ps: setOpaque(false) // ist durchsichtig



Oder so.


----------



## Marce (24. Jul 2004)

Hi,
ich habe nochmal ein Problem:
Ich hab einen Hintergrund, den ich mit drawIMage(...) zeichnen lasse.
Darauf setze ich dann meine Figur. diese wird auch AUF das Bild gezeichnet, wie bei dem Bild oben.
Sobald ich aber 
	
	
	
	





```
this.setOpaque(false);
```
 mache Zeichnet er die Figur HINTER den Hintergund.

Weiß jemand eine Lösung?


----------



## Grizzly (24. Jul 2004)

Versteh' ich jetzt nicht. Kannst Du den Code mal posten?


----------



## Marce (24. Jul 2004)

Klasse von der Figur

```
package maedn;

import javax.swing.*;
import java.awt.*;

public class Figur extends JPanel{
  Image bild;
  Punkt startPos;
  public Figur(int color, Punkt startPos) {
   this.bild = Toolkit.getDefaultToolkit().getImage("figur" + color + ".gif");
   this.startPos = startPos;
   this.setSize(new Dimension(23, 23));
  // this.setOpaque(false);
   this.repaint();
 }

  public void paint(Graphics g){
    super.paint(g);
    g.drawImage(bild, 0, 0, this);
  }
}
```
Klasse von dem Spielplan

```
package maedn;

import javax.swing.*;
import java.awt.*;

public class Spielplan extends JPanel{
  Image bild = Toolkit.getDefaultToolkit().getImage("bg.gif");
  Punkt[][] spielerPos = new Punkt[4][4];
  Figur[][] spieler = new Figur[4][4];
  Punkt[][] startPos = new Punkt[4][2];

  public Spielplan() {
    this.setSize(new Dimension(400, 400));
    this.setLayout(null);
    this.setBorder(null);

    startPos[0][0] = new Punkt(30,330);
    /* ... */
    startPos[3][1] = new Punkt(15,165);

    // Firuren erzeugen
    for (int i = 0; i < 4; i++){
      /* ... */
    }
    // Figuren setzen
    for (int i = 0; i < 4; i++){
      /* ... */
    }
    for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) this.add(spieler[i][j],null);
    this.repaint();
  }

  public void paint(Graphics g){
    super.paint(g);
    g.drawImage(bild, 0, 0, this);
    //for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++)spieler[i][j].repaint(); <- tut auch nicht
  }

}
```


----------



## Grizzly (24. Jul 2004)

Das sieht für mich alles ein bisschen merkwürdig aus. Hier mal mein Vorschlag:

```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.IOException;

/**
 * Eine Spielfigur.
 */
public class Figur {
	/** Das Bild. */
	private Image bild = null;
	/** Die Position der Figur. */
	private Point position = null;
	
	/**
	 * Erstellt eine Figur mit dem entsprechenden Grafik an der entsprechenden Ausgangsposition.
	 * @param color Die Farbe der Grafik.
	 * @param position Die Position.
	 * @throws IOException Wenn beim Laden des Bildes ein Fehler auftrat.
	 * @throws IllegalArgumentException Wenn die Position <code>null</code> ist.
	 */
	public Figur(int color, Point position) throws IOException {
		super();
		
		String filename;
		
		filename = "figur" + color + ".gif";
		this.bild = Toolkit.getDefaultToolkit().getImage(filename);
		if (this.bild == null) {
			throw new IOException("Couldn't load image '" + filename + "'.");
		}
		if (position == null) {
			throw new IllegalArgumentException("Argument position is null.");
		}
		this.position = position;
	}
	
	/**
	 * Zeichnet die Figur.
	 * @param g Der Grafikkontext.
	 */
	public void paint(Graphics g) {
		g.drawImage(this.bild, position.x, position.y, null);
	}
}
```


```
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.JComponent;

/**
 * Ein Spielplan.
 */
public class Spielplan extends JComponent {
	/** Die Hintergrundgrafik. */
	private Image bild = null;
	/** Die Spielfiguren. */
	private Vector figuren = new Vector();
	
	/**
	 * Erzeugt einen Spielplan.
	 * @throws IOException Wenn beim Laden der Bilder ein Fehler auftrat.
	 */
	public Spielplan() throws IOException {
		super();
		this.setSize(new Dimension(400, 400));
		
		// Hintergrund laden.
		this.bild = Toolkit.getDefaultToolkit().getImage("bg.gif");
		if (this.bild == null) {
			throw new IOException("Couldn't load image 'bg.gif'.");			
		}
		
		// Figuren erzeugen und setzen.
		for (int i = 0; i < 4; i++){
			this.figuren.addElement(new Figur(i, new Point(i, i)));
		}
	}

	public void paint(Graphics g){
		Iterator iterator;
		
		g.drawImage(this.bild, 0, 0, this);
		iterator = this.figuren.iterator();
		while (iterator.hasNext()) {
			Figur figur = (Figur) iterator.next();
			figur.paint(g);
		}
	}
}
```


----------



## Marce (24. Jul 2004)

ne sorry da macht er genausowenig!

Ich krieg noch die Kriese!


----------



## Grizzly (24. Jul 2004)

Wenn er die Figuren hinter den Hintergrund zeichnet, woher weisst Du dann, das er die Grafiken überhaupt zeichnet?


----------



## Marce (24. Jul 2004)

wenn ich die Zeile, in der er den Hintergund zeichnet auskommentiere sind sie da.


----------



## Grizzly (24. Jul 2004)

Du weist aber schon, dass das Laden der Bilder etwas dauern kann, da Java dies in einem extra Thread macht. Wenn Du sicher sein willst, dass zuerst das Bild geladen wird bevor das Programm weiterläuft, musst Du einen MediaTracker benutzen.
Vielleicht liegt ja das Problem daran.


----------



## Marce (24. Jul 2004)

Jo... ich weiß - hab ich auch schon probiert und daran liegt es nicht - ich hab eigentlich schon alles möglich und auch unmögliche probiert, aber nchts funktioniert - hab auch schon ne andere Entwicklungsumgebung und die neuste jdk runtergeladen. Hat alles nichts gebracht.


----------



## Marce (24. Jul 2004)

OK! Es funktioniert jetzt. ich weiß noch nihct warum... ich poste es sobald ich den Grund gefunden hab...


/e: also allen was ich verändert habe:
- Ich habe den MediaTracker auskommentiert
- alle repaints rausgemacht
- alle super rausgemacht
- und ich habe das Hintergrundbilad auch als Extra Klasse gemacht (extends JComponent)
- ich habe ERST die Figuren zeichnen lassen und DANN den Hintergrund (mir völlig unverständlich)
Bis hier habe ich es aber so weit ich weis davor auch schon alles mal probiert gehabt.

- Ich hab in meinem Frame ein Button erstellt, mit dem ich den Spielplan gerepaintet hatte (weil ich sehen wollte ob es daran liegt, dass das Bild zu lange braucht um geladen zu werden) - und siehe da: die Figuren sind AUF dem Hintergrund.
Button wieder rausgemacht - immernoch!

Also manchmal.......... *%&=$grmpf§&*


----------

