tobi(at)vonloesch.de
|
Java applet TutorialBilder anzeigen und verändern via MemoryImageSource1.1 Applet und Thread erzeugenFür das Applet müssen wir eine neue Klasse erzeugen, abgeleitet von java.applet.Applet (welche abgeleitet ist von java.awt.panel, d.h. es ist ein Container) mit der Schnittstelle Runnable (wird nicht unbedingt für das Applet benötigt, jedoch für den Thread). Ein Applet benötigt im Gegensatz zu einer normalen Applikation keine main()-Methode, sondern die init() und start() Methoden regeln die Ausführung des Applets. Außerdem müssen wir noch ein paar Klassen importieren, zum Laden und Bearbeiten des Bildes. import java.awt.* Als nächstes benötige wir ein paar Variablen, einerseits für das Zoomen, andererseits die für das Bild benötigten Speicherstrukturen. int width=216;
//Breite de Bildes Den Thread erzeugen wir in der Methode start(), die aufgerufen wird, wenn das Applet zum ersten mal angezeigt wird und wenn es gestoppt wurde und dann weiterläuft (z.B. das Applet wird vom Browser wieder reingescrollt). Die Methode stop() beendet die Ausführung (z.B. wenn der Browser geschlossen wird), hier wird der Thread gestoppt. public void start(){ 1.2. InitialisierungEinen Konstruktor ist nicht nötig, da wir alle Initialisierungen in init() vornehmen, diese wird immer aufgerufen, sobald das Applet
vom Browser geladen wird. Da wir bei Applets nicht vorhersage können, wann die nötige
Ressource (Bilder, Sound,...) fertig geladen sind, müssen wir die zu ladenden Objekte mit
einem MediaTracker überwachen.Die
Methode getCodeBase() gibt den
Pfad des Applets zurück, damit wir unser zu ladendes Bild nicht global angeben müssen.
Mit getImage(URL, string) können wir ein Bild in das Applet laden, wobei
getimage
(URL, string) gif und jpeg Bilder verarbeiten und laden kann.
public void init() 1.3 Die BerechnungDie Methode run() wird vom Thread als Startmethode aufgerufen und enthält den eigentlichen
Laufzeitcode. Viel mache wir hier nicht, das neue Bild wird in ZoomIn (int) berechnet und dann via repaint() dargestellt. Nach der Darstellung
schläfern wir den Thread für 30 Ms ein, damit es nicht so schnell läuft, im nächsten
Tutorial, werden wir eine Zeitmessung machen, um diesen Wert besser einzustellen (damit es
auf allen Computern ungefähr gleich schnell läuft). Ein kleines Manko an Java ist, daß
es sich selbständig um die Verwaltung des Speichers kümmert und manche Methoden und
Objekte damit nicht gerade sparsam umgehen. Der GarbageCollector arbeitet in den Pausen.
Da er aber nach meinen Erfahrungen die Pause nicht so richtig nutzt und das ganze Applet
irgendwann furchtbar anfängt zu ruckeln und man das Gefühl hat, er formatiert die
Festplatte rufen wir den gc()
selber auf nach einem vollen Zoom und vermeiden so, daß der Speicher zu voll wird.
public void run(){ 1.4 Die BildschirmausgabeDamit unser nun neu errechnetes Bild schnell auf den Bildschirm kommt, werden die paint(Graphics) und die update(Graphics) Methoden überschrieben, die paint(Graphics)-Methode ist ja logisch, die update(Graphics) Methode ist wichtig, weil Java dort normalerweise erst ein löschen des Bildschirmbereichs vorsieht und das flimmert und ist unglaublich langsam. Da wir eh den ganze Bereich überschreiben muß da auch vorher nichts gelöscht werden. public synchronized void paint(Graphics g) } 1.5 Der RestDer Rest ist nur zum Überprüfen des Mauszustandes. public boolean mouseEnter(Event e, int x, int y){ 1.6 Nachwort und VorschauSo, das war´s. Jetzt ist der tolle Zoomer fertig. Der Algorithmus zum Zoomen ist wahrscheinlich nicht besonders gut, ich habe mir da nie soviel Gedanken gemacht, weil das eh immer nur zum Testen ist. Auch die Bildschirmausgabe via MemoryImageSource ist noch nicht das Ultimum, man sieht ja in dem Graphen oben, wieviel Schritte man machen muß um das fertige Ergebnis zu sehen. Das kann natürlich nicht besonders schnell sein. Im nächsten Tutorial werde ich eine andere Möglichkeit vorstellen und bald auch zeigen, wie man die gute alte 8Bit Palette benutzt. Für einfache Effekte reicht diese Methode jedoch aus. Ich bin für alle Anregungen und Verbesserungen dankbar, da auch meine Java Kenntnisse noch lange nicht perfekt sind. ©©©©18.Juli.0 Tobias von Loesch
|