• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Cursorのアニメーション
#navi(../)
*Cursorのアニメーション [#j7158da4]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-05-01~
更新日:&lastmod;
---
category: swing
folder: AnimatedCursor
title: Cursorのアニメーション
tags: [Cursor, Animation]
author: aterai
pubdate: 2006-05-01T12:35:56+09:00
description: Timerを使ったCursorの切り替えで、マウスポインタのループアニメーションを行います。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTHkbNXdwI/AAAAAAAAARY/RzDAT8xyR3c/s800/AnimatedCursor.png
---
* 概要 [#summary]
`Timer`を使った`Cursor`の切り替えで、マウスポインタのループアニメーションを行います。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTHkbNXdwI/AAAAAAAAARY/RzDAT8xyR3c/s800/AnimatedCursor.png)

**概要 [#h001fd76]
マウスカーソルをアニメーションさせます。
* サンプルコード [#sourcecode]
#code(link){{
Toolkit tk = Toolkit.getDefaultToolkit();
list[0] = tk.createCustomCursor(tk.createImage(url00), pt, "00");
list[1] = tk.createCustomCursor(tk.createImage(url01), pt, "01");
list[2] = tk.createCustomCursor(tk.createImage(url02), pt, "02");
animator = new Timer(100, new ActionListener() {
  private int counter;
  @Override public void actionPerformed(ActionEvent e) {
    button.setCursor(list[counter]);
    counter = (counter + 1) % list.length;
  }
});
button = new JButton(new AbstractAction("Start") {
  @Override public void actionPerformed(ActionEvent e) {
    JButton b = (JButton) e.getSource();
    if (animator.isRunning()) {
      b.setText("Start");
      animator.stop();
    } else {
      b.setText("Stop");
      animator.start();
    }
  }
});
}}

#screenshot
* 解説 [#explanation]
- `JButton`のクリックでパネル上にあるカーソルのアニメーションを開始
- `3`枚の透過`png`ファイルをコマにして`Timer`で順番にこれを切り替え

**サンプルコード [#h16203df]
 list[0] = tk.createCustomCursor(tk.createImage(url00), p, "00");
 list[1] = tk.createCustomCursor(tk.createImage(url01), p, "01");
 list[2] = tk.createCustomCursor(tk.createImage(url02), p, "02");
 setCursor(list[0]);
 animator = new javax.swing.Timer(100, new ActionListener() {
   private int count = 0;
   public void actionPerformed(ActionEvent e) {
     setCursor(list[count]);
     count = (count<list.length-1)?count+1:0;
   }
 });
 JButton button = new JButton(new AbstractAction("スタート") {
   public void actionPerformed(ActionEvent e) {
     JButton button = (JButton)e.getSource();
     if(animator.isRunning()) {
       button.setText("スタート");
       animator.stop();
     }else{
       button.setText("ストップ");
       animator.start();
     }
   }
 });
* 参考リンク [#reference]
- [https://w.atwiki.jp/vippointer/ VIPポインタ@Wiki - トップページ]
-- このサンプルの各コマは[http://www11.atwiki.jp/vippointer/pages/54.html ぶーん(通常の選択.ani、VIPポインタ)]から[http://www.vector.co.jp/soft/win95/amuse/se195017.html ANIめーかー]を使って生成
- [https://www.vector.co.jp/soft/win95/amuse/se195017.html ANIめーかー(Windows95/98/Me/アミューズメント)]
- [[Cursorオブジェクトの生成>Swing/CustomCursor]]
- [https://www.oreilly.co.jp/books/4873112788/download.html oreilly.co.jp -- Online Catalog: Java Swing Hacks]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Toolkit.html#createCustomCursor-java.awt.Image-java.awt.Point-java.lang.String- Toolkit (Java Platform SE 8)]

-&jnlp;
-&jar;
-&zip;
* コメント [#comment]
#comment
- `Cursor`に用いる`png`ファイルは、フルカラー(`24`ビット)ではなく`256`色にしておかないと、うまく透過できないようです。もしかしたら自分の`PC`の画面の色が`16`ビットになっているせいかもしれません。 -- &user(aterai); &new{2006-07-11 (火) 12:41:59};
-- `32`ビットにしてもだめみたいです。 -- &user(aterai); &new{2006-07-25 (火) 16:53:29};
-- 追記: `JDK 6`なら、フルカラーでも問題なく透過できるようです。[https://bugs.openjdk.org/browse/JDK-6388546 &#91;JDK-6388546&#93; PNG with transparent background doesn't render correctly - Java Bug System] -- &user(aterai); &new{2008-07-28 (月) 16:27:56};
- `Windows XP`で、カーソルを`Animated GIF`ファイルから生成(`Toolkit.getDefaultToolkit().createCustomCursor`)しようとすると、 %%落ちる?%% `Ubuntu`だと、アニメーションはしないけど、ちゃんと画像がカーソルになる。 -- &user(aterai); &new{2007-05-08 (火) 14:25:37};
-- デッドロック? -- &user(aterai); &new{2008-05-07 (水) 19:38:38};
-- メモ: [https://bugs.openjdk.org/browse/JDK-4343270 &#91;JDK-4343270&#93; Toolkit.createCustomCursor() hangs the VM under Win NT - Java Bug System]、[https://bugs.openjdk.org/browse/JDK-4939855 &#91;JDK-4939855&#93; Please allow Toolkit.createCustomCursor() to accept multi-frame images - Java Bug System] -- &user(aterai); &new{2008-09-01 (月) 23:18:57};
-- よくみたら、[https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Toolkit.html#createCustomCursor-java.awt.Image-java.awt.Point-java.lang.String- Toolkit#createCustomCursor(...)]に、「マルチフレームイメージは無効で、このメソッドがハングすることがあります。」と注意書きが存在する(`1.4.2`のドキュメントから?)。 -- &user(aterai); &new{2010-01-19 (火) 17:03:17};

**解説 [#b3798cf8]
上記のサンプルでは、ボタンをクリックすると、パネル上にあるカーソルがアニメーションするようになっています。3枚の透過pngファイルをコマにして、Timerで順番にこれを切り替えています。

各コマは、[[ぶーん(通常の選択.ani、VIPポインター)>http://www11.atwiki.jp/vippointer/pages/11.html]]から、[[ANIめーかー>http://www.vector.co.jp/soft/win95/amuse/se195017.html]]を使って生成しています。

**参考リンク [#bf958cfb]
-[[VIPポインター@Wiki - トップページ>http://www11.atwiki.jp/vippointer/]]
-[[ANIめーかー(Windows95/98/Me/アミューズメント)>http://www.vector.co.jp/soft/win95/amuse/se195017.html]]
-[[Cursorオブジェクトの生成>Swing/CustomCursor]]
-[[oreilly.co.jp -- Online Catalog: Java Swing Hacks>http://www.oreilly.co.jp/books/4873112788/download.html]]

**コメント [#q9ef944e]
- Cursorに用いるpngファイルは、フルカラーではなく256色にしておかないと、うまく透過できないようです。もしかしたら自分のPCの画面の色が16ビットになっているせいかもしれません。 -- [[terai]] &new{2006-07-11 (火) 12:41:59};

#comment