見栄えの悪いマウスカーソル

a-san2005-10-24

AWTで自分の作ったカーソルを設定しようとしたのですが、どうも不自然に拡大されて、ギザギザが目立っています。どうやら画像がgetBestCursorSize()の32x32に拡大されているようです。
そこで、プログラム側でベストなカーソルサイズに作り直してから登録するようにしました。これでキレイに表示されました。

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;

class TestBestCursor {
      public static void main(String[] args) throws Exception {
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            for (int i=0; i<=64; i++) {
                  Dimension dim = toolkit.getBestCursorSize(i, i);
                  System.out.println("i="+i+" dim="+dim);  // 全部32x32になる。
            }
            BufferedImage image = ImageIO.read(new File("Earth.png"));
            Dimension dim = toolkit.getBestCursorSize(image.getWidth(), image.getHeight());
            if (dim.width != image.getWidth() || dim.height != image.getHeight()) {
                  BufferedImage newimage = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_4BYTE_ABGR);
                  Graphics2D g2 = (Graphics2D) newimage.getGraphics();
                  g2.drawImage(image, 0, 0, new Color(255,0,0,0), null);
                  image = newimage;
            }
            Cursor cursor = toolkit.createCustomCursor(image, new Point(8, 8), "earth");
            JFrame frame = new JFrame();
            JLabel label = new JLabel("らべる");
            label.setCursor(cursor);
            frame.getContentPane().add(label);
            frame.setSize(640, 480);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
      }
}