2017-01-17 30 views
3

我正在學習swing圖形,我想嘗試更改java中的遊標顏色。於是我下載了一些金色星星的gif文件來嘗試使用我的光標,但是當我將圖像添加爲ImageIcon時,它將星星的顏色變成黑色。你如何改變java中的遊標顏色?

編輯:改變語法

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(); 
    } 
} 

我通過一些對光標的方法看,但我沒有找到任何可以幫助我。

這是我想結合起來,作爲我的鼠標光標圖片: cursor

回答

3

您可以加載描述爲here的gif圖像幀並循環播放它們。

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

您應該考慮使用一個非動畫圖像,因爲Toolkit.createCustomCursor狀態的文檔是:

注該多幀圖像無效,並可能導致此方法掛起 。

或者,您也可以使用Cursor對象(在你的情況定製的)的陣列,並創建一個Thread動畫。

以下是一個示例:Change Cursor in a thread for animation : Cursor

+0

是否有可能以任何方式使用動畫形象? – Objekshin

+0

@Objekshin:我不這麼認爲,但如果您想自己創建動畫,請參閱上次編輯。 – Berger

+0

@Objekshin:我測試了另一個答案,它運行得非常好(如果您不使用Java 8,請檢查使用'Timer'的正確語法)。因爲它是全球比我更好的答案,我不介意你接受這個其他答案:) – Berger