Ein Image Provider ist eine Image
Konstante und ein Image
Descriptor zugleich. Ein Image Provider muss nicht
explizit in der Image
Registry registriert werden. Bei der ersten Verwendung
wird mit Hilfe des Image
Descriptor Anteil ein Image
Handle erzeugt und für die
Image Konstante
registriert. Dadurch spart man sich zum Beispiel das Halten von
Schlüsseln in der Image Registry für Icons, welche gar nicht zur
Laufzeit verwendet, aber in einer Icon Bibliothek vorhanden
sind. Derzeit werden zwei Image Provider Typen unterstützt, der
IImageUrlProvider
und der
IImageStreamFactoryProvider
.
Die Schnittstelle IImageUrlProvider
hat die
folgende Methode:
URL getImageUrl();
Die Klasse ImageUrlProvider
implementiert
diese Schnittstelle und zudem auch die Schnittstelle
ICacheable
, wodurch ein
ImageUrlProvider
mittels
release()
aus der
Image Registry entfernt
werden kann. Das folgende Beispiel demonstriert die Verwendung
der Klasse ImageUrlProvider
:
1 final ImageUrlProvider icon = new ImageUrlProvider(iconFile); 2 3 button1.setIcon(icon); 4 button2.setIcon(icon); 5 6 ... 7 8 button1.dispose(); 9 button2.dispose(); 10 11 //release the icon from the image registry if no longer used 12 icon.release();
Der ImageUrlProvider
wird in Zeile 1
erzeugt und in Zeile 12 wieder released. Da es sich um einen
Image Provider handelt,
ist ein explizites registrieren in der
Image Registry nicht
notwendig. Für beide Widgets wird nur ein
Image Handle erzeugt,
welches bei der ersten Verwendung automatisch in der Image
Registry registriert wird. Man muss
sich selbst darum kümmern, die Konstante, wenn sie nicht mehr
benötigt wird, aus der Image Registry zu entfernen.
Mit dem folgenden Code würde man das gleiche wie mit
icon.release()
erreichen:
Toolkit.getImageRegistry().unRegisterImageConstant(icon);
Anmerkung: Gemeinsam genutzte Icons sollten besser in einer dauerhaft gültigen Konstante, wie zu Beispiel einer Enum gehalten, und nur in Ausnahmefällen disposed werden. Durch das Disposen von Icons welche man mehrfach verwendet, können Fehler auftreten, welche unter Umständen nur schlecht reproduzierbar sind. Da man in der Regel (auch in großen Applikationen) nicht Unmengen von unterschiedlichen Icons verwendet, und diese somit auch nicht unverhältnismäßig viel Speicher benötigen, könnte man das Disposen von momentan nicht verwendeten Icons unter Umständen als verfrühte Optimierung (premature optimization) im Sinne von Knuth betrachten. Es gibt jedoch Fälle, wo es sinnvoll sein mag aufzuräumen, zum Beispiel wenn mit Hilfe eines Icon Chooser alle verfügbaren Icons einer Bibliothek angezeigt und somit auch geladen wurden. Hier ist es durchaus sinnvoll, diese Icons anschließend wieder aus der Image Registry zu entfernen.
Die Schnittstelle
IImageStreamFactoryProvider
hat die
folgende Methode:
InputStream createInputStream();
Der Input Stream wird genau dann erzeugt, wenn ein natives
Image benötigt wird. Jeder Aufruf muss einen neuen Input
Stream liefern, der insbesondere nicht null
sein darf. Der Stream wird vom Aufrufer der Methode
geschlossen (close()
), wenn er nicht mehr
benötigt wird.