Swing Eigenen Cursor setzen

beastofchaos

Bekanntes Mitglied
Hi Leute,
Ich versuche gerade einen eigenen Cursor zu setzen. Im Package liegt das Bild "cursor.gif". Das Problem: Wenn ich nun im Programm über das Panel gehe, verschwindet der Cursor. Sprich offensichtlich lädt er das Bild nicht richtig... 🙁

Java:
        Toolkit toolkit = Toolkit.getDefaultToolkit();  
        Image image  = toolkit.getImage("cursor.gif");
        Point hotSpot = new Point(5, 5);
        Cursor c = toolkit.createCustomCursor(image, hotSpot, "Changer");
        
        setCursor(c);

Ich hab schon versucht, das Bild über ein ImageIcon zu laden, was auch nichts bringt. Bringt es vll. was, das Bild über "SwingUtilities.invokeLater" zu laden?

Gruß, Thomas
 
Also bei mir läuft dein Code...
Vielleicht hast du das Bild nur noch nicht an der richtigen Stelle?
Du hast ja einen relativen Pfad angegeben, das ist auch schon mal gut so. Aber vielleicht befindet sich dein Bild an sich nicht im Projektverzeichnis?

Ach ja. Wenn du willst, dass dieser Cursor immer dann sichtbar wird, wenn du über ein bestimmtes Panel fährst, dann solltest du einen MouseListener verwenden und davon die MouseEntered Methode überschreiben...
 
Zuletzt bearbeitet:
Vermutlich wird das Bild garnicht gefunden. Zum Laden von Bildern sollte man heutzutage
Code:
ImageIO.read(File file)
oder
Code:
new ImageIcon(getResource(String path)).getImage()
verwenden.
Ich würde den Cursor wie folgt erstellen:
Java:
Cursor c = toolkit.createCustomCursor(new ImageIcon(getResource("cursor.gig").getImage(), new Point(5, 5), "Changer");
Falls das Bild nicht gefunden wird, wird eine NullPointerException geworfen.
Ach ja. Wenn du willst, dass dieser Cursor immer dann sichtbar wird, wenn du über ein bestimmtes Panel fährst, dann solltest du einen MouseListener verwenden und davon die MouseEntered Methode überschreiben...
Dafür reicht - wie oben aufgeführt - einfach ein Aufruf von setCursor(Cursor cursor) an der jeweiligen Komponente.
 
Code:
Cursor c = toolkit.createCustomCursor(new ImageIcon(getResource("cursor.gif")).getImage(), new Point(5, 5), "Changer");

Also so hatte ich es am Anfang auch (bei dir steht noch ein getRessource(?)):
Code:
Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(new ImageIcon("cursor.gif").getImage(), new Point(5, 5), "Changer");

Ich versuchs jetzt noch einmal mit diesem Code 😉

...

Funktioniert immer noch - hiermal, in welchem Kontext es aufgerufen wird:

Java:
public class CPreview extends JPanel{
    ...
    public CPreview(Color cA, Color cB){
        colorA = cA;

        colorB = cB;
        
        setOpaque(false);
        
        Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(new ImageIcon("cursor.gif").getImage(), new Point(5, 5), "Changer");
        
        setCursor(c);                                                           // funktioniert nicht
    }
    ...

Die Klasse stellt eine Vorschau von zwei Farben in meinem Malprogramm dar. Soll ich euch mal die jar von dem Program mgeben, damit ihr das Problem seht? 😛 Der Cursor wird einfach "unsichtbar" bzw. ein leeres Image wird angezeigt.

...

So habs jetzt mit ImageIO versucht:
Java:
Cursor c = new Cursor(Cursor.DEFAULT_CURSOR);
        try {
            Image image = ImageIO.read(new File("cursor.gif"));
            c = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(5, 5), "Changer");
        } catch (IOException ex) {
            // sonst: c = Toolkit.getDefaultToolkit().createCustomCursor(new ImageIcon("cursor.gif").getImage(), new Point(5, 5), "Changer");
        }
        
        setCursor(c);

Der Cursor ist jetzt ganz normal (Default_Cursor), weil eine IOException geworfen wird. Wieso findet er das Bild nicht?
Im Anhang ein Bild, wie es in der "Projects"-Ansicht (von NetBeans) aussieht.


Gruß und Dankeschön für bisherige Hilfe, Thomas
 

Anhänge

  • cursorProblem.png
    cursorProblem.png
    10,9 KB · Aufrufe: 41
(bei dir steht noch ein getRessource(?))
Das hatte einen Grund.

Versuch mal:
Java:
Cursor c = toolkit.createCustomCursor(new ImageIcon(getResource("/colors/cursor.gif").getImage(), new Point(5, 5), "Changer");
oder:
Java:
Cursor c = toolkit.createCustomCursor(new ImageIcon(getResource("colors/cursor.gif").getImage(), new Point(5, 5), "Changer");
 
Genau das sagte ich ja vorhin! 😉
Dein Pfad stimmt nicht. Dein Bild steckt ja im Ordner colors.

Dafür reicht - wie oben aufgeführt - einfach ein Aufruf von setCursor(Cursor cursor) an der jeweiligen Komponente.

Stimmt... Hatte irgendwie in Erinnerung, dass man dafür nen Listener verwendet... 😉
 
Zuletzt bearbeitet:
also funktioniert jetzt einwandfrei - Dankeschön 😉

Muss leider doch einen MouseListener benutzen, fällt mir gerade auf:
Denn das Panel enthält zwei halb über einander liegende Labels und nur bei einem soll der Cursor sein, aber weiterhin kein Problem - Thema ist fertig 😛
 
Ist mir schon klar, aber das eine Label liegt über dem anderen. Das hintere soll diesen Cursor haben. Problem: Sobald ich auf das hintere aber klicke, schiebt sich das in den Hintergrund und genau deswegen, hab ich die beiden Labels entfernt, jeweils ersetzt mit Color und lasse immer nur Rectangles malen.
 

Neue Themen


Zurück
Oben