2017-01-17 5 views
3

Ich arbeite daran Swing-Grafiken zu lernen, und ich wollte versuchen, die Cursor-Farbe in Java zu ändern. Also habe ich eine gif-Datei mit einigen goldenen Sternen heruntergeladen, um sie für meinen Cursor zu verwenden, aber als ich das Bild als ImageIcon hinzugefügt habe, hat es die Farben der Sterne schwarz gemacht.Wie änderst du die Cursorfarbe in Java?

EDIT: Changed Grammatik

import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.Point; 
import java.awt.Toolkit; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class stuff { 
    public static void main (String[] args) 
    { 
     JFrame frame = new JFrame("FRAME"); 
     JPanel lpanel = new JPanel(); 
     frame.setContentPane(lpanel); 
     ImageIcon goldStar = new ImageIcon("./res/goldStar.gif"); 
     JLabel gs = new JLabel(goldStar); 
     lpanel.add(gs); 

     goldStar = new ImageIcon(goldStar.getImage().getScaledInstance((int)(goldStar.getIconWidth()/13), (int)(goldStar.getIconHeight()/13), Image.SCALE_SMOOTH)); 
     lpanel.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(goldStar.getImage(),new Point(0,0), "custom cursor")); 
     //I think these two lines are creating the problem. 

     lpanel.setPreferredSize(new Dimension(1600,900)); 
     frame.setVisible(true); 
     frame.pack(); 
    } 
} 

Ich suchte nach Cursor einige der Methoden durch, aber ich habe nichts gefunden, das mir helfen könnte.

Dies ist das Bild, das ich bin versucht, wie mein Mauszeiger zu integrieren: cursor

Antwort

3

Sie können Frames von gif Bild wie beschrieben here laden und über sie hinwegschleifen.

import javax.imageio.ImageIO; 
import javax.imageio.ImageReader; 
import javax.imageio.stream.ImageInputStream; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    private int currentIndex; 

    public Main() throws IOException { 
     JFrame frame = new JFrame("FRAME"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     frame.setContentPane(panel); 

     List<Cursor> cursors = new ArrayList<>(); 
     List<BufferedImage> frames = getFrames("GWigb.gif"); 
     for (BufferedImage image : frames) { 
      cursors.add(Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "cursor image")); 
     } 

     Timer timer = new Timer(50, (actionEvent) -> { 
      panel.setCursor(cursors.get(currentIndex++)); 
      if (currentIndex >= cursors.size()) 
       currentIndex = 0; 
     }); 
     timer.start(); 

     panel.setPreferredSize(new Dimension(1600, 900)); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    public List<BufferedImage> getFrames(String gif) throws IOException { 
     List<BufferedImage> frames = new ArrayList<>(); 
     ImageReader reader = ImageIO.getImageReadersByFormatName("gif").next(); 
     File input = new File(gif); 
     ImageInputStream stream = ImageIO.createImageInputStream(input); 
     reader.setInput(stream); 

     int count = reader.getNumImages(true); 
     for (int index = 0; index < count; index++) { 
      frames.add(reader.read(index)); 
     } 
     return frames; 
    } 

    public static void main(String[] args) throws IOException { 
     new Main(); 
    } 

} 
2

Sie sollten, da die Dokumentation von Toolkit.createCustomCursor besagt, dass unter Verwendung eines nicht-animierten Bild betrachten:

Hinweis Diese Multi-Frame-Bilder sind ungültig und können dazu führen, dass diese Methode auf hängt.

Alternativ können Sie eine Reihe von Cursor Objekten (benutzerdefiniert diejenigen in Ihrem Fall), verwenden und die Animation in einem Thread erstellen.

Hier ist ein Beispiel: Change Cursor in a thread for animation : Cursor.

+0

Ist es möglich, ein animiertes Bild in irgendeiner Weise zu verwenden? – Objekshin

+0

@Objekshin: Ich denke nicht, aber sehen Sie die letzte Änderung, wenn Sie die Animation selbst erstellen möchten. – Berger

+0

@Objekshin: Ich habe die andere Antwort getestet und es funktioniert wirklich gut (wenn Sie nicht Java 8 verwenden, überprüfen Sie die richtige Syntax, um 'Timer' zu verwenden). Da es global eine bessere Antwort als meine ist, hätte ich nichts dagegen, dass du stattdessen diese andere Antwort akzeptierst :) – Berger

Verwandte Themen