getSize() - Echte Höhe bestimmen

Hallo Hallo,

vielen dank euch beiden für eure Antworten! :slight_smile:

Klar, lade das Bild nur einmal

:smiley: Ich bin dabei :stuck_out_tongue: :smiley:

Sobald ein Bild geladen wurde solltest du dir das in eine geeignete Datenstruktur (bspw. Map) legen. Wenn dann ein Bild angefordert wird schaust du zuerst in der Map nach ob dort schon das Bild vorhanden ist. Falls ja, nimmst du das. Falls nein lädst du das Bild aus dem Dateisystem und legst es in die Map.
Das ganze lässt sich prima in einer eigenen Klasse kapseln.

Ich wusste, früher oder später muss ich mich damit befassen. Habe nun schon viel mit Java gemacht, aber mich immer um Maps gedrückt. Vielleicht ein Problem, in dieser Situation. Ich werde mich erstmal zur Funktionalität belesen.
Alles was ich bisher weiß bzw. denke, dass es stimmt ist, dass es ähnlich wie bei Python diese Key-Value-Zuordung gibt.
Ich probiere mich dran. @Spacerat hat dankenswerterweise ja gleich ein Beispiel gepostet.

Darauf möchte ich einmal eingehen. Vielen Dank für das Posten eines Musterbeispiels. Ich brauche aber sicherlich noch 2-3 Posts zum Nachhaken. Ich möchte wie gesagt ungern Code übernehmen, den ich selbst nicht nachvollziehen kann.

Aber ich würde von mehreren Verzeichnissen (also z.B. „./gastkarten“ usw.) absehen und statt dessen ein weiteres Enum einsetzen und für jede Konstellation Bilder mit „null“ im Namen speichern.

Das hab ich in erster Linie schon einmal übernommen. Ich fand das auch ein wenig unübersichtlich. Ist nun alles im obersten Verzeichnis meines einzigen Sourceordners. Man erkennt die Unterteilung ja eh schon an gast_, tisch_ oder ähnlichem.

So und nun zum Code. Ich habe mal versucht das in das hinein zu integrieren, was ich bereits habe.
Also Beispielsweise das was Du hier so schön geschrieben hast:

        setLand(l);
        setGeschlecht(g);
        setTyp(t);
    }```
hab ich bei 
```public Spielzelle(Typ t) {
	    setTyp(t);
	}```
gelassen, weil Geschlecht und Land später festgelegt werden.
Ich probiere das mal so. :) Die Zelle kann weiterhin zwei Typen Tisch oder Stuhl haben, wovon Tisch nur Land als Eigenschaft hat und Stuhl sowohl Land, als auch Geschlecht.

=====

So und nun sieht es so aus, wenn ich alles eingebaut habe in meine Strukturen:
```package spiel;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.TreeMap;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class Spielzelle extends JPanel {
	
	public enum Geschlecht {Mann, Frau};
	public enum Typ {Leer, Stuhl, Tisch};
	public enum Land {DE, FR, GB, US, TR, IN, CN, RU, ES, CU, CF, IT, JOKER};

	private Typ t;
	private BufferedImage i;
	private Stuhl st;
	private Tisch ti;
	private static final Map<String, BufferedImage> CACHE = new TreeMap<>();
    private static final BufferedImage DEFAULT_IMAGE;
    
    static {
        BufferedImage bi = null;
        try {
            URL url = new URL(BaseURL.getJarBase(Spielfeld.class), "defaultImage.jpg");
            bi = ImageIO.read(url);
            if(bi == null) {
            	bi = ImageIO.read(url);
            }
        } catch (MalformedURLException e) {
        } catch (IOException e) {
        }
        DEFAULT_IMAGE = bi;
    }
	 
	public Spielzelle(Typ t) {
	    setTyp(t);
	}

	@Override
    protected void paintComponent(Graphics gr) {
        super.paintComponent(gr);
        if(i == null) {
            i = loadImage(this.t);
        }
        gr.drawImage(i, 0, 0, getWidth(), getHeight(), null);
    }
	
	private synchronized BufferedImage loadImage(Typ ty) {
		String key = null;
		BufferedImage bi = null;
		if(ty.equals(Typ.Stuhl)) {
			if(this.getSt().getGast()!=null) {
				key = "./gast_"+this.getSt().getGast().land+"_"+this.getSt().getGast().geschlecht+".jpg";
			} else {
				key = "./stuhl_leer.jpg";
			}
		} else if(ty.equals(Typ.Tisch)) {
			if(this.getTi().getLand()!=null) {
				key = "./tisch_"+this.getTi().getLand().land+".jpg";
			} else {
				key = "./tisch_leer2.jpg";
			}
		}
		if(!ty.equals(Typ.Leer)) {
			bi = CACHE.get(key);
	        if(bi == null) {
	            try {
	                URL url = new URL(BaseURL.getJarBase(Spielfeld.class), key);
	                bi = ImageIO.read(url);
	            } catch (MalformedURLException e) {
	            } catch (IOException e) {
	            }
	            if(bi == null) {
	                bi = DEFAULT_IMAGE;
	            }
	            CACHE.put(key, bi);
	        }
		}
		return bi;
    }
	
	public Typ getTyp() {
	    return t;
	}
	 
	public void setTyp(Typ t) {
	    if(t != this.t) {
	    	i = null;
	    }
	    this.t = t;
	}
	 
	public Stuhl getSt() {
		return st;
	}

	public void setSt(Stuhl st) {
		this.st = st;
	}

	public Tisch getTi() {
		return ti;
	}

	public void setTi(Tisch ti) {
		this.ti = ti;
	}
}```

Läuft 1A. Perfekt. Und es scheint wirklich schneller zu gehen, als ich dachte. Dankeschön! :) 

Wenn jemand eine Verbesserung des Quellcodes für mich hat, soll er diese bitte anbringen. :)

=====
Achso, eine Frage hätte ich mal so nebenbei. So aus Erfahrung von irgendwem.
Mein Spiel ist 1200 mal 800 Pixel groß.
Ein Bild ist geschätzt rund 140 (x) mal 80 (y) Pixel groß in der Anzeige, in meinem Spielbildschirm.
Die von mir erstellen Bilder haben immer so eine Auflösung von rund 3.500 mal 2.400 Pixeln und sind dementsprechend auch mal 10 MB groß oder sowas.
Klar dass der lange lädt. Die werde ich eh noch verkleinern müssen. Kann mir einer von euch sagen, wie klein ich die Bilder machen kann, sodass die Qualität in Java in einem JPanel noch groß genug ist, aber das Bild eine möglichst kleine Bildgröße hat?


Vielen Dank für die Beantwortung meiner Fragen.

Schönen Abend
Lukas

Also 200100 sollten schon reichen zumindest auch für höhere Auflösungen als deine (1200800). Ansonsten ist ein zehntel vom jetzigen, also 350*240 definitiv genug.