15.35 Selbst definierte Cursor
Bei einem Cursor sind wir nicht allein auf die vordefinierten Muster angewiesen. Leicht lässt sich aus einer Grafik ein eigener Cursor definieren. Dazu bietet das Toolkit die Methode createCustomCursor() an. Als Parameter geben wir ein Image-Objekt, einen Hotspot und einen Namen an. Der Hotspot definiert eine Art Nullpunkt, der die Spitze angibt. Zeigt etwa der Standardcursor mit einem Pfeil nicht wie üblich nach oben, sondern nach unten, so gibt der untere Punkt den Nullpunkt an. Der Name ist nur nötig, wenn Java-Accessibility genutzt wird, also eine Möglichkeit, den Cursor zum Beispiel ohne Maus anzusprechen.
Beispiel Setze den Cursor mit der Grafik cursor.gif und den Hotspot auf (10,10).
Cursor c = getToolkit().createCustomCursor(
new ImageIcon( "cursor.gif" ).getImage(),
new Point(10,10), "Cursor" );
setCursor( c );
|
Hinweis Animierte Cursor bietet die Java-Umgebung nicht an. Wir könnten selbstständig in einem Thread immer wieder mit setCursor() unterschiedliche Cursor setzen, um etwa eine drehende Sanduhr oder eine rotierende Festplatte zu bekommen.
|
Da grafische Oberflächen in der Regel keine Cursor beliebiger Auflösung und Farbanzahl zulassen, lässt sich das Toolkit auch über diese Parameter erfragen. Die Methode getBestCursorSize() liefert die mögliche Größe des Cursors zurück. Es ist sinnvoll, diese Methode vorher aufzurufen, um ein passendes Bild auszuwählen. Ähnlich wie bei den Icons in der Titelleiste werden die Grafiken sonst skaliert, und das kann ziemlich schlecht aussehen. Gleiches gilt bei den Farben. Nicht alle Systeme erlauben beliebig viele Farben für den Cursor. Die maximale Farbanzahl liefert die Funktion getMaximumCursorColors(). Notfalls wird der Cursor auf die Farbanzahl heruntergerechnet.
Tipp Unterstützt die Plattform Cursor beliebiger Größe, so lässt sich dadurch einfach eine Bubble-Help realisieren, die nicht rechteckig ist. An Stelle des Cursors wird eine Grafik mit dem Cursor zusammen mit einer Hilfe angezeigt. Das Betriebssystem verwaltet den Cursor, und wir müssen den Hintergrund nicht sichern und mit der Hilfe verknüpfen.
|
abstract class java.awt.Toolkit
|
|
Cursor createCustomCursor( Image cursor, Point hotSpot, String name )
throws IndexOutOfBoundsException |
|
Erzeugt ein neues Cursor-Objekt. Liegt der Hotspot außerhalb der Grenzen der Grafik, wird eine IndexOutOfBoundsException ausgelöst. |
|
Dimension getBestCursorSize( int preferredWidth, int preferredHeight )
Liefert die unterstützte Cursor-Größe, die den gewünschten Ausmaßen am nächsten liegt. Oft werden die Parameter ignoriert, wenn die Umgebung keine beliebige Cursor-Größe zulässt. Erlaubt das System überhaupt keine selbst definierten Cursor, erhalten wir ein Objekt der Dimension (0,0). |
|
int getMaximumCursorColors()
Liefert das Maximum an Farben, welches das Toolkit für Cursor unterstützt. Der Rückgabewert ist null, wenn selbst definierte Cursor nicht gestattet sind. |
15.35.1 Flackern des Mauszeigers bei Animationen vermeiden
Einige Betriebssysteme haben bei Java-Animationen das Problem, dass der Mauszeiger unruhig flackert. Das Problem kann in Java nicht direkt gelöst werden, denn es ist Sache der grafischen Oberfläche, den Mauszeiger mit dem Hintergrund zu verbinden. Um dennoch ein unruhiges Bild zu vermeiden, kann man zu einem Trick greifen: Wir schalten den Mauszeiger einfach ab. Dazu definieren wir uns mit createCustomCursor() einen eigenen Cursor. Der schwierigste Parameter ist das transparente Image-Objekt. Da wir kein leeres transparentes Gif-Bild nutzen wollen, legen wir einfach mit der Klasse BufferedImage ein Bild im Speicher an. Der Parameter muss dabei TYPE_INT_ARGB sein, sonst ist das Bild nicht transparent. Damit ist die Arbeit getan, der letzte Schritt ist, den Cursor mit setCursor() einer Komponente zuzuweisen. Im Fall einer Animation wäre das zum Beispiel ein JComponent, in unserem folgenden Beispiel wird das eine Schaltfläche sein.
Listing 15.47 NullCursor.java
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
public class NullCursor
{
public static void main( String args[] )
{
JFrame f = new JFrame();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JButton b = new JButton( "Kein Cursor" );
f.getContentPane().add( b, BorderLayout.NORTH );
b.setCursor( Toolkit.getDefaultToolkit().createCustomCursor(
new BufferedImage( 16, 16, BufferedImage.TYPE_INT_ARGB ),
new Point(0,0), "" ) );
f.setSize( 200, 200 );
f.setVisible( true );
}
}
|