8.7.1 | Cursor |
Seit dem JDK 1.1 ist es möglich, die Darstellung des Cursor für jede Komponente zu ändern. Beim JDK 1.0 konnte man eine Cursor-Form jeweils nur für einen Frame festlegen.
Im JDK 1.1 wird ein Cursor durch die Klasse Cursor repräsentiert. In dieser Klasse sind zahlreiche Konstanten enthalten, die stellvertretend für die verschiedenen Erscheinungsformen eines Cursors stehen:
Tabelle 8.3: Konstanten für die einzelnen Cursor-Formen DEFAULT_CURSOR WAIT_CURSOR S_RESIZE_CURSOR CROSSHAIR_CURSOR N_RESIZE_CURSOR SW_RESIZE_CURSOR HAND_CURSOR NE_RESIZE_CURSOR W_RESIZE_CURSOR MOVE_CURSOR E_RESIZE_CURSOR NW_RESIZE_CURSOR TEXT_CURSOR SE_RESIZE_CURSOR Jede Komponente hat bereits einen voreingestellten Cursor. Wenn man den Mauszeiger in ein Textfeld bewegt, erscheint der Cursor, der der Konstante TEXT_CURSOR zugeordnet ist.
Der aktuell eingestellte Cursor einer Komponente kann man mit der Methode getCursor() abfragen. getCursor() ist in der Klasse Component definiert und liefert das Cursor-Objekt zurück, das den gerade eingestellten Cursor repräsentiert.
Um einen Cursor in einer Komponente zu ändern, muss zunächst einmal ein Cursor-Objekt angelegt werden. Hierbei wird dem Konstruktor der Klasse Cursor die Konstante übergeben, die die gewünschte Cursor-Darstellung repräsentiert:Cursor c = new Cursor(Cursor.MOVE_CURSOR);Anschließend kann der Cursor mit der Methode setCursor() gesetzt werden. setCursor() ist ebenfalls in der Klasse Component definiert:Draw can = new DrawComponent(); can.setCursor(c);Im obigen Beispiel wird der Cursor in einer von JComponent abgeleiteten Klasse gesetzt.
Es ist zu beachten, dass die Cursor-Form innerhalb der Komponenten-Hierarchie an alle Komponenten vererbt wird, die über den Cursor-Typ DEFAULT_CURSOR verfügen. Verfügt eine Komponente allerdings über einen anderen Cursor-Typ, so übernimmt der Cursor in dieser Komponente nicht die Darstellung seines Containers. Das ist z. B. bei den Textkomponenten der Fall, aber auch, wenn man einer beliebigen Komponente mit der Methode setCursor() einen anderen Cursor-Typ als DEFAULT_CURSOR zuweist. Der neue Cursor-Typ hat dann Vorrang vor dem Vererbten.
Ab demJDK 1.2 ist es möglich, eigene Cursor-Formen zu definieren, falls dies die Plattform zulässt, unter der eine Java-Anwendung ausgeführt wird. Zu diesem Zweck wurden der Klasse Toolkit einige neue Methoden hinzugefügt. Die wichtigste dieser Methoden ist
public Cursor createCustomCursor(Image, Point, String)Diese Methode verfügt über drei Parameter: Ein Image-Exemplar, das den eigentlichen Cursor darstellt, ein Point-Exemplar, das den Hotspot innerhalb des Bildes spezifiziert und einen String, der einen sprechenden Namen für den Cursor enthalten sollte. Mit Hotspot ist der Punkt innerhalb des Cursors gemeint, mit dem geklickt werden kann. Bei einem pfeilförmigen Cursor ist das z. B. üblicherweise die Pfeilspitze.
Als Grundlage für Cursor bieten sich vor allem Bilder im gif-Format an, die über einen transparenten Hintergrund verfügen. Das zugrunde liegende Bild sollte jedoch in Hinblick auf zwei Eigenschaften möglichst ideale Voraussetzungen mitbringen: Die Bildgröße und die Anzahl der verwendeten Farben. Für die Abfrage der optimalen Bildgröße stellt die Klasse Toolkit die Methodepublic Dimension getBestCursorSize(int, int)zur Verfügung. Als Parameter werden gewünschte Breite und Höhe des Cursors angegeben. Die verwendete Größe wird als Ergebnis zurückgegeben. Falls eine Plattform das Erzeugen eines benutzerdefinierten Cursor nicht unterstützt, liefert getBestCursorSize() ein Dimension-Exemplar mit einer Breite und einer Höhe von 0 zurück. Verwendet man ein Bild für einen Cursor, das größer ist als der von getBestCursorSize() zurückgelieferte Wert, skaliert createCustomCursor() das Bild automatisch auf die richtige Größe.
Eine weitere wichtige Methode der Klasse Toolkit istpublic int getMaximumCursorColors()Diese Methode liefert die Anzahl an Farben zurück, die für einen Cursor verwendet werden kann. Ein Ergebniswert von 0 zeigt an, dass die Plattform keine benutzerdefinierten Cursor unterstützt. Liefert diese Methode 2 als Ergebnis, werden nur schwarz-weiß Cursor unterstützt. Nach Möglichkeit sollte das verwendete Bild dann auch schon in diesem Format vorliegen.
Die Verwendung eines benutzerdefinierten Cursor wird im Folgenden an einem Beispiel demonstriert: Beim Start des Applets wird ein handförmiger Cursor eingestellt. Beim Druck einer Maustaste wird der Cursor zu einem faustförmigen Cursor verändert, bis die Maustaste wieder losgelassen wird. Während der gesamten Laufzeit des Applets wird der Hotspot des aktuellen Cursor durch ein Fadenkreuz markiert.
Zunächst werden die entsprechenden Cursor erzeugt:Image handimg, fistimg; // Erzeugen der Cursor handimg = getImage(getCodeBase(), "images/handcur.gif"); fistimg = getImage(getCodeBase(), "images/fistcur.gif"); hand = t.createCustomCursor(handimg, new Point(12, 2), "HandCursor"); fist = t.createCustomCursor(fistimg, new Point(12, 8), "FistCursor"); // Standard-Cursor setzen setCursor(hand);Beim Druck bzw. beim Loslassen einer Maustaste wird dann anschließend der Cursor verändert:switch(e.getID()) { case MouseEvent.MOUSE_PRESSED: // Bei Mausdruck Faustcursor setzen setCursor(fist); break; case MouseEvent.MOUSE_RELEASED: // Beim Loslassen der Maustaste Handcursor setzen setCursor(hand); }