Dynamisches Instantiieren (Reflections)

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi, ich möchte beim Programmstart alle Bilder in einem Ordner laden, um sie später anderen Klassen al öffentliche Konstanten zur Verfügung zu stellen. Allerdings weiss ich nicht wie ich das dynamisch hinkriegen soll, hier mein Versuch:

Java:
class IconPool {

	public static BufferedImage ABOUT;
	public static BufferedImage MANUAL;
	public static BufferedImage SAVE;
	public static BufferedImage LOAD;
	// ...

	public void init() {
		Field[] fields = IconPool.class.getDeclaredFields();
		for (Field f : fields) {
			String fileName = f.getName().toLowerCase() + ".png";
			String filePath = "assets/img/" + fileName;
			f = ImageIO.read(ImagePool.class.getResourceAsStream(filePath));
		}
	}
}

Das Problem ist, dass die Zuweisung zu "f" nicht funktioniert. Klar irgendwie, ich versuche ein BufferedImage in einem Field zu speichern.
Auf der anderen Seite denke ich mir: Kann man meine Idee vllt doch verwirklichen? Ich kenn mich mit Reflections nicht so aus...

Und wenn es so nicht geht, habt ihr ne andere Idee? Was ich halt vermeiden will, ist dass ich immer viel Code umschreiben muss, nur weil ich neue Bilder hinzufüge oder umbenenne, lösche usw.

Ich möchte halt dass mein Programm alle Bilder in einem Ordner scannt, daraus Images macht, und sie Konstanzen zuweist. Die Namen der Konstanten stehen ja in einer logischen Beziehung zu den Namen der Bild-Dateien.

Danke für Hilfe :)
 

DarXun

Aktives Mitglied
Könntest du dir nich einfach den Inhalt des Ordners in einen String Array holen, und dann die Namen der Dateien als Key für eine Map nehmen?
Oder willst du nur bestimmte Inhalte des Ordners einlese?
Ansonsten wüsst ich auch nichts weiter, da die Namen der Konstanten ja in logischer Beziehung zu den Dateinamen stehen sollen.
 

hdi

Top Contributor
Hi, danke erstmal.

Das wär ne Alternative, da hast du schon Recht. Dabei verliert man halt die Vorteile von Konstanten. Die Klassen, die auf ein Bild zugreifen wollen, müssen dann halt den Dateinamen kennen. Mit Konstanten wäre es schöner, weil man sich ganz einfach anzeigen lassen kann, was es so gibt und was nicht.

...aber dein Vorschlag ist gut genug. Ich hab nur ein Problem, und zwar liegen meine
Bilder innerhalb meines Projekts in einem Ordner, also nicht auf der Platte, sondern im Jar.

Wie lese ich denn so einen ins Jar integrierten Ordner aus?

Danke!
 

hdi

Top Contributor
Hey, ok da keiner antwortet dachte ich mir das muss eine dumme Frage sein. Und so war's ja auch, wusste nicht dass man das angeben kann wie auch bei normalen Files auf der Platte :oops:

Naja, jetzt hab ich aber trotzdem noch n kleines Problem, vllt steh ich grad auf dem Schlauch aber ich versteh grad nicht wieso folgende Sache nicht funktioniert:

Java:
String dirPath = "assets/icons/";
		File imgDir = new File(dirPath);
		File[] pics = imgDir.listFiles();
		total = pics.length;
		for (File pic : pics) {
			String name = pic.getName();
			try {
				BufferedImage img = ImageIO.read(IconPool.class
						.getResourceAsStream(dirPath + name));
				IconPool.pics.put(name, img);
			} catch (IOException e) {
				e.printStackTrace();
			}

Ich bekomme die Exception:

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)


Also er findet den Ordner, denn er findet auch Files. Hab mir das ausgeben lassen. Wie kann es also sein, dass wenn er zB ein Bild in diesem Ornder namens "bild.png" findet, dass er danach beim laden mit ImageIO.read dieses Bild nicht findet? Ich benutze ja an beiden Stellen für den Pfad die gleiche Variable (nämlich dirPath)

Ideen?
 

HoaX

Top Contributor
Weil getResourceAsStream das Bild nicht findet und null liefert. Schreib doch einfach stattdessen new File(imgDir, name)

IconPool.class.getResourceAsStream sucht nach der übergebenen Datei im Classpath relativ zum Package von IconPool und nicht irgendwo im Dateisystem (solange dieses nicht auch im Classpath ist)
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Unterschied: Polymorphie und Dynamisches Binden Allgemeine Java-Themen 8
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
N Eclipse Dynamisches-Web-Project auf anderen Rechner transportieren Allgemeine Java-Themen 5
looparda Dynamisches Konsolenprogramm Allgemeine Java-Themen 3
T Dynamisches p:graphicimage im Datagrid Allgemeine Java-Themen 7
C Dynamisches und sortiertes Auslesen von Properties Allgemeine Java-Themen 2
P Dynamisches Binden Allgemeine Java-Themen 7
X Dynamisches hinzufügen von Panles Allgemeine Java-Themen 4
A Dynamisches Enum? Allgemeine Java-Themen 2
S dynamisches Array für Primfaktorzerlegung Allgemeine Java-Themen 13
S Dynamisches Manipulieren/Laden von Klassen Allgemeine Java-Themen 4
Z Dynamisches JPanel Allgemeine Java-Themen 10
H2SO3- dynamisches anlegen der dimensionaltität eines arrays Allgemeine Java-Themen 6
reibi Klassenpfad mal anders - dynamisches Laden einer Klasse Allgemeine Java-Themen 7
lumo "Exzessiv" dynamisches generieren Allgemeine Java-Themen 6
P dynamisches Array / Vector Allgemeine Java-Themen 2
R Dynamisches Laden von JNI-Bibliotheken Allgemeine Java-Themen 4
N Mehrdimensionales dynamisches Array Allgemeine Java-Themen 3
T Dynamisches laden von java Klassen Allgemeine Java-Themen 2
B Dynamisches Linken Allgemeine Java-Themen 15
M Dynamisches ausführen von methoden unbekannter klassen Allgemeine Java-Themen 6
V dynamisches laden von klassen Allgemeine Java-Themen 8
C Dynamisches Nachladen von JARs (Plugin) Allgemeine Java-Themen 3
S Dynamisches Casten Allgemeine Java-Themen 5
M Statisches und dynamisches Binden? Allgemeine Java-Themen 2
S Dynamisches Feld generieren. Allgemeine Java-Themen 10
E Dynamisches Instanziieren Allgemeine Java-Themen 2
B dynamisches Laden aller Klassen in einem Ordner ?? Allgemeine Java-Themen 5
S mit Class eine Klasse nur einmal instantiieren Allgemeine Java-Themen 4
B "Instantiieren" eines Objekts eines Interfaces Allgemeine Java-Themen 10
G Java Reflections Allgemeine Java-Themen 6
T Diskussion - Reflections Allgemeine Java-Themen 21
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
hdi Zu Reflections & Annotations Allgemeine Java-Themen 10
M Typ einer inneren Klasse mit reflections finden Allgemeine Java-Themen 7
T Klasse mit Reflections adden Allgemeine Java-Themen 3
K Reflections Fragen Allgemeine Java-Themen 7
S Reflections (invoke-Methode) Allgemeine Java-Themen 13
G Typ Parameter & Reflections Allgemeine Java-Themen 4
Nils_Langner Wo bin ich gerade? Reflections Allgemeine Java-Themen 3
S Reflections und inherited Fields Allgemeine Java-Themen 4
S Reflections und final Allgemeine Java-Themen 19
N Reflections mit Unter- und Oberklasse Allgemeine Java-Themen 2
F Reflections Allgemeine Java-Themen 6
S Auf statische Funktionen mit Java Reflections zugreifen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben