# HashMap liefert nicht gewünschten Wert (gar nix)



## fuuya (17. Dez 2013)

Hallo liebes Forum,
ich weiß, mein Problem ist etwas komplexer, aber ich werde versuchen es so plausibel wie möglich zu erklären.
---Einleitung---
Vorweg: der Quellcode des ganzen Programms ist als Java-package  hier auf mediafire zu finden (da sind ein paar bilder dabei also nicht wundern, warum das ganze so groß ist). ich werde im folgenden nur Ausschnitte daraus verwenden, wer mehr Hintergrundwissen will lädt sich das ganze runter und kann es sich dann im editor angucken.
Außerdem bin ich noch "Anfänger" was das programmieren mit Java angeht, besonders mit GUI-Elementen (Erfahrungen bereits seit mehreren Jahren in anderen Programmiersprachen und Java sein 1 1/2 Jahren an der Schule).


---Problem---
Mein Problem ist folgendes:
Ich lese in einer Initialisierungsmethode ein BufferedImage ein und male einen Teil davon in ein neues BufferedImage. Dieses speichere ich dann in einer HashMap<Entity, BufferedImage> ab. Wenn ich dann allerdings das ganze mit der get(Entity)-Methode wieder abrufen will, kommt nicht das raus was ich will (nämlich nix).

Code:

```
//Init - Methode in dem TexturContainer
                BufferedImage temp = ImageIO.read(getClass().getResource(entityFileName));

                BufferedImage player = new BufferedImage(200, 200, imgType);
                BufferedImage zombie = new BufferedImage(200, 200, imgType);

                Graphics2D g;

                g = player.createGraphics();
                g.drawImage(temp,
                        0, 0, 200, 200,
                        0, 0, 200, 200,
                        null);

                g = zombie.createGraphics();
                g.drawImage(temp,
                        0, 0, 200, 200,
                        0, 200, 200, 400,
                        null);


                entities.put(new Player(null).getKey(), player); //Player und Zombie sind Unterklassen von Entity
                entities.put(new Zombie(0, 0, null, 0).getKey(), zombie); //getKey() liefert eine singleton instanz
```


```
//get(Entity key, int status)-Methode des TextureContainer s
            BufferedImage img = new BufferedImage(50, 50, imgType);
            Graphics2D g = img.createGraphics();
            switch ((int) key.getdirection()) {
                case 0:
                    g.drawImage(entities.get(key),
                            0, 0, 50, 50,
                            50 * status, 0, 50 * status + 50, 50, null);
                    break;
                case 1:
                    g.drawImage(entities.get(key),
                            0, 0, 50, 50,
                            50 * status, 50, 50 * status + 100, 50, null);
                    break;
                case 2:
                    g.drawImage(entities.get(key),
                            0, 0, 50, 50,
                            50 * status, 100, 50 * status + 150, 50, null);
                    break;
                case 3:
                    g.drawImage(entities.get(key),
                            0, 0, 50, 50,
                            50 * status, 150, 50 * status + 200, 50, null);
                    break;
                default:
                    System.out.println("Fehler bei der Richtung von key (TextureContainer)");
            }
            return img;
```
wenn ich dann das Bild malen lasse, wird nix gemalt. das Bild hat eine Größe von 200 * 400 und besteht aus 2*16 einzelbildern (erst Spieler, dann Zombie - horizontal die verschiedenen Laufstadien, vertikal die verschiedenen Richtungen)

Ich freue mich auf Rückmeldung


----------



## Gucky (17. Dez 2013)

Ich kann mir deinen ganzen Code gerade nicht ansehen aber mir fallen mehrere Dinge auf: Arbeitest du mit Swing? Wenn ja, hast du an die paintComponent-Methode gedacht, um auf den Swing Elementen zu zeichnen? Und hast du die preferredSize() auf etwas Richtiges gesetzt? Sonst kann nicht sichtbar gemalt werden.

Du benutzt die graphics eines BufferedImage. Woher weiß das Image, worauf es malen soll? Musst du nicht das Graphics des Containers, den du verwendest nehmen und da dann g.draeImage(deinBild) nehmen? Malst du nicht sonst auf dem noch nicht gemalten BufferedImage? Das ist jetzt aber nur Spekulation.


----------



## turtle (18. Dez 2013)

Wenn deine Vermutung richtig ist, warum schreibst du nicht ein kleines Testprogramm, das deine Vermutung prüft?

Mein kleiner Test funzt ohne Probleme:

```
public class LblTest extends JPanel {
	Map<String, ImageIcon> map;
	JLabel pigLabel = new JLabel();

	public LblTest(String picName) {
		map = new HashMap<>();
		ImageIcon imageIcon1 = LblTest.createImageIcon("images/Pig.gif");
		ImageIcon imageIcon2 = LblTest.createImageIcon("images/Bird.gif");
		map.put("Pig", imageIcon1);
		map.put("Bird", imageIcon2);
		ImageIcon imageIcon = map.get(picName);
		pigLabel.setIcon(imageIcon);
		add(pigLabel);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("B");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new LblTest(args[0]));
		frame.pack();
		frame.setVisible(true);
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = LblTest.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}
}
```


----------



## fuuya (18. Dez 2013)

Zu Gucky:

Ja das klappt alles. Die get Methode dient lediglich dazu die Texturen aus dem Container zu holen, dieses Bild wird dann auf ein Panel gemalt.
EDIT: JPanel


Zu turtle:

Eigentlich sollte es genau so funktionieren, tut es nur leider nicht...


----------



## Ruzmanz (18. Dez 2013)

Der Link funktioniert nicht. Nehme einfach einen String als Schlüssel für die HashMap und es wird wahrscheinlich funktionieren. Ich glaube du hast da einige Konzepte nicht verstanden und vermischt so ein paar Sachen.

- Singleton ... Warum ist es sinnvoll über den statischen Weg auf Singleton-Instanzen zuzugreifen?
- HashMap ... Wie funktioniert das für Objekte?


----------



## fuuya (18. Dez 2013)

https://www.mediafire.com/download/l5vf0q1ybhffbxq/mainGame.zip jup hier ist der link, sry dass ich den anderen falsch kopiert habe :bloed:

EDIT: ja danke, anstatt singleton instanzen zu nehmen, nehm ich jetzt nen String, dürfte tatsächlich einfacher sein


----------

