2017-01-17 3 views
3

Я работаю над изучением качающейся графики, и я хотел попытаться изменить цвет курсора в java. Поэтому я загрузил gif-файл некоторых золотых звезд, чтобы попытаться использовать его для моего курсора, но когда я добавил изображение в качестве ImageIcon, он превратил цвета звезд в черный.Как изменить цвет курсора в java?

EDIT: Изменены грамматики

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

Вы можете загрузить рамы gif-изображения, как описано here, и закольцовать их.

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, проверьте правильный синтаксис на использование таймера). Поскольку это глобально лучший ответ, чем мой, я бы не возражал, что вместо этого вы принимаете этот другой ответ :) – Berger