Menu

Cursor Icon

Gismo
Attachments
finger.png (3832 bytes)
icon_2.png (41143 bytes)
icons.png (79829 bytes)
pen.png (328 bytes)

Dem Mauszeiger (Cursor) ein anderes Icon zuweisen

Anwendungsfall

Wird ein Cursortool nicht aus dem Menü oder einer Toolbox heraus aktiviert, sondern aus einem Plugin, so kann es passieren, dass das Bild des Mauszeigers (Cursor) nicht aktualisiert wird, obwohl die Funktion aktiviert wurde. Der Mauszeiger zeigt noch das alte Icon und wechselt erst nach dem ersten Klick zum Icon der Funktion.

Dies ist ein Problem des OpenJump-Frameworks, da wahrscheinlich nicht vorgesehen wurde, dass ein CursorTool durch ein anderes (Cursor-)tool aufgerufen wird. Dennoch können wir in Manuela dieses Problem beheben, indem wir das Maussymbol manuell schon einmal auf das Symbol setzen, das zu der Funktion gehört.

In diesem Beispiel aktivieren wir im „Bodendaten hinzufügen“-Plugin, das zum „Bodendaten-Projekt“ gehört, das ‚SoilDrawingTool‘. Wir erwarten, dass der Mauszeiger zu einem Stift wird (‚Pen.gif‘), doch wir müssen dies selbst einstellen:

Beispiel

Java, Beispiel aus: ‚…src\de\luh\iup\manuela\soiltype\cursorcreate\SoilCreatingViewFXController‘ |
---------- |
import javax.swing.ImageIcon;
import com.vividsolutions.jump.workbench.ui.images.IconLoader;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Cursor;
import java.awt.Point;

ImageIcon imageIcon = new ImageIcon(IconLoader.class.getResource("Pen.gif"));
Image img = imageIcon.getImage();
Toolkit kit = Toolkit.getDefaultToolkit();
Cursor cursor = kit.createCustomCursor
(img, new Point(1, imageIcon.getIconHeight()-1), "myCursor");
swingToFxView.getContext().getLayerViewPanel().setCursor(cursor);

Zuerst wird das ImageIcon geladen. Diese Methode ist folgender OpenJump-Klasse ähnlich: ‚com.vividsolutions.jump.workbench.ui.images.IconLoader‘. Hier stehen 2 Optionen zur Verfügung:

  • Laden eines OpenJump-Bildes. (Das tun wir in diesem Beispiel.) In diesem Fall kann auch alternativ der OpenJump IconLoader benutzt werden. Wichtig ist hier bei, dass Ressourcen in dem Pfad geladen werden, in dem auch die Klasse ‚IconLoader‘ ist, da wir ‚IconLoader.class.getResource()‘ verwenden.


(Die OpenJump-Icons befinden sich in folgendem Pfad: '…\src\com\vividsolutions\jump\workbench\ui\images'. Sie sind natürlich in der kompillierten Version von OpenJump enthalten, als auch in der Quelldatei mit Sources, z.B. ‚OpenJUMP-1.6.3-r3576-src.zip‘.)

  • Die zweite Möglichkeit ist, wie in den Manuela-Plugins Icons mit relativem Pfad zu laden. Dabei ist das Package, in dem das Icon geladen wird relativ durch ‚this.getClass().getResource()‘ definiert. Konkret liegt es 2 Verzeichnisse (‚../../‘) über dem Verzeichnis der Klasse ‚SoilCreatingViewFXController‘ und danach im Verzeichnis ‚/icons‘.

Java, Beispiel |
---------- |
import de.luh.iup.manuela.base.ManuelaSettings;

ImageIcon imageIcon = new ImageIcon(this.getClass().getResource("../../icons/" + ManuelaSettings.KEY_ICON_FIELDATTRIBUTE_TOOL));

Dieser Befehl erstellt eine Referenz auf das Bild. Informationen über das Bild, z.B. Höhe und Breite bleiben jedoch nur in dem ImageIcon.

Erstellt eine Refernz auf das AWT-Toolkit. Den Maus-Cursor zu ändern ist also weder eine Funktion von Manuela, noch von OpenJump, sondern eine ganz allgemeine AWT-Funktionalität.

Mit Hilfe dieser AWT-Methode wird ein neuer Cursor erzeugt. Er verwendet das Image und definiert einen AWT-Point, der angibt, wo sich die Mausspitze im Bild befindet. Die hier verwendeten Koordinaten (1, imageIcon.getIconHeight()-1) passen genau zu dem ‚Pen.gif‘ und wurden durch Ausprobieren ermittelt. Der Name „myCursor“ spielt in diesem Zusammenhang keine Rolle und ist beliebig.

Der eben erzeugte Cursor wird nun einem einzelnen AWT-Panel hinzugefügt. Das bedeutet, in allen anderen Panelen ist es der normale Mauszeiger oder der an anderer Stelle definierte Mauszeiger. Da es in diesem Beispiel um den Stift geht, der im OpenJump-Projekt-LayerView-Fenster eingesetzt werden soll, ist das richtige Panel ‚…context.getLayerViewPanel()‘:


(Der grün markierte Teil ist das LayerView-Unterfenster des OpenJump Projekt-Fensters. Das OpenJump Projekt-Fenster ist das Fenster, das hier mit „Kronsberg_Bodentest 2015“ beschriftet ist.)

(Der Context ist der ‚com.vividsolutions.jump.workbench.plugin.PlugInContext‘.)

Debugging

Es kann schwierig sein, gleichzeitig diese Funktion zu implementieren und den richtigen Pfad und Pfadtyp zu finden. Während der Entwicklung kann daher zunächst ein vordefinierter AWT-Cursor-Typ, z.B. der Handschuh verwendet werden:

Java |
---------- |
Cursor cursor = new Cursor(Cursor.HAND_CURSOR);
swingToFxView.getContext().getLayerViewPanel().setCursor(cursor);


Related

Wiki: Inhalt

Auth0 Logo