setCursor() lässt Cursor ganz verschwinden

Blagg Dogg

Mitglied
hi, ich bins mal wieder 🙂

ich programmiere gerade ein kleines spiel und will auch den mauszeiger verändern. folgenden code habe ich aus dem insel-buch.

Cursor c = getToolkit().createCustomCursor(
new ImageIcon( "cross.png" ).getImage(),
new Point(10,10), "Cursor" );
setCursor( c );

allerdings sehe ich danach gar keinen cursor mehr?! ???:L
ich habs im jframe und im jpanel versucht.

jemand 'ne ahnung, woran das liegen kann?

danke
 
Lass' dir mal die einzelnen Parameter ausgeben, meine Kristallkugel sagt, das
System.out.println("Das hier "+new ImageIcon( "cross.png" ).getImage());
"null" ist, weil das Bild nicht gefunden wird.
 
mmmh... ja aber warum kann er das nicht laden, das Bild ist 100%ig da...

null wird da auch nicht ausgegeben sondern sun.awt.image.ToolkitImage@3860458b ... allerdings auch wenn ich irgendnen anderen namen angebe....???:L
 
Zuletzt bearbeitet:
Ne, wenn da was anderes als 'null' steht ist alles OK, Kommando zurück (hier waren kürzlich etliche Threads mit ~"meine Daten werden nicht gefunden"...)

Wenn er trotzdem nichts anzeigt kann ich erstmal nur spekulieren. Kannst du es mit irgendeinem Bild probieren, das man auf einem der erstbesten Suchergebnisse zu diesem Thema findet (z.B. Using Custom Cursors in Java - Code Beach ) um auszuschließen, dass es doch irgendwie an dem Bild liegt? Ggf. muss man mal ein KSKB basteln...

EDIT: BTW: In dem Link wird das Bild mit dem Toolkit geladen, aber das sollte egal sein
 
das komische ist ja auch, dass nicht null zurück gegeben wird, auch wenn ich statt "cross.png" einen anderen string eingebe... das verstehe ich ja gar nicht...
 
Ach Moment, er gibt auch NICHT-null zurück, wenn dort ein Name angegeben wird, den es gar nicht gibt? Das kann eigentlich nicht sein...

Aber... (wie zu erwarten war) ... dieses KSKB (dessen Erstellung eigentlich deine Aufgabe gewesen wäre) funktioniert schonmal mit der pencil.gif
Java:
package _temp;

import java.awt.Cursor;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CursorTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.getContentPane().setLayout(new GridLayout(1,1));
                
                JPanel p = new JPanel();
                f.getContentPane().add(p);
                
                Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(
                    new ImageIcon( "pencil.gif" ).getImage(),
                    new Point(10,10), "Cursor" );
                p.setCursor( c );
                
                f.setSize(400,400);
                f.setVisible(true);
                
            }
        });
    }
}
 
das gibt es doch nicht. habe deinen 1:1 kopiert und er läuft nicht... sehe keinen cursor... auch wenn ich das wieder mit syso ausgeben lasse, zeiigt er mir auch nicht null an - egal bei welchem string - das gleiche wie bei mir. ich denke, ich werde eclipse neu installieren...
 
@Marco13: Sie haben so eben ein Toolkit-Image-Phänomen entdeckt, herzlichen Glückwunsch. Diesem ist's nämlich zunächst erst mal völlig egal, ob sich hinter dem Namen überhaupt Content verbirgt (sprich die Datei gefunden wurde oder nicht bzw. andere Ladefehler auftraten), aber null wird es zumindest nicht. Das merkt man erst, wenn man es per MediaTracker laden will. Ich weis jeztz nur nicht mehr, ob der Tracker 'ne Exception warf oder ob es erst bei dem Kopieren in ein BI auffiel, weil width und height -1 (invalid) bleiben.
[EDIT]Und wenn ich mir "loadImage()" von ImageIcon so betrachte, war glaub' ich sogar letzteres der Fall.[/EDIT]
[EDIT]Bestätigt... letzteres war der Fall...
Java:
Image img = new ImageIcon("ich bin nicht da!").getImage();
System.out.println(img);
System.out.println(img.getWidth(null));
ergibt
Code:
sun.awt.image.ToolkitImage@31ce069f
-1
[/EDIT]
[EDIT]Ach ja... BTW.: ImageIcon lädt auch per Toolkit.[/EDIT]
[EDIT]Boah... Neue Erkenntnisse nehmen kein Ende... Verwendest du Gifanimationen oder andere MultiFrameBilder? Die funktionieren nicht.
Note that multi-frame images are invalid and may cause this method to hang.
Allerdings würde sich dann (im KSKB) nicht mal der Frame aufbauen.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
habs jetzt hinbekommen:

Java:
Cursor c=null;
		try {
			URL url = getClass().getClassLoader().getResource("cross.png");
			c = Toolkit.getDefaultToolkit().createCustomCursor(
			    ImageIO.read(url),
			    new Point(10,10), "Cursor" );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		setCursor(c);

aber noch eine frage: nur ImageIO.read(new File("cross.png")) gibt ein fehler... weiß wer woran das liegt?
 
Files und URLs sind himmelweite Unterschiede. Files-> FileSystem, URLs->Everywhere Else. Deine Bilder befanden sich wohl im Klassenpfad (bin/src-Verzeichnis von Eclipse) und wurden deswegen als Resource gewertet. Solche Resourcen werden nur mit "getRessource()", welches eine URL liefert gefunden. Wenn du "ImageIcon(URL ressource).getImage()", funktionierts dann auch damit. Ein Grund, warum ich File Objekte nur noch sehr selten verwende, URLs sind viel flexibler.
 

Neue Themen


Zurück
Oben