カーソルをカスタマイズする

f:id:skrb:20081112172233p:image:right

なんで上のようなことを見つけたかというと、カーソルを書き換えたかったからなんです。

カスタムカーソルはイメージを読み込んで、それを引数にして java.awt.Toolkit の createCustomCursor メソッドをコールします。これで得られるのは Java のカーソルなので、これを JavaFX のカーソルの awtCursor アトリビュートに代入します。

ということで、ブロックを使ってカスタムカーソルを作ってみました。

import javafx.application.Frame;
import javafx.application.Stage;
import javafx.scene.Cursor;
import javafx.scene.geometry.Rectangle;
import javafx.scene.paint.Color;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.net.URL;

var cursor: Cursor  = Cursor {
    awtType: java.awt.Cursor.CUSTOM_CURSOR 
    awtCursor: {
        var toolkit:Toolkit = Toolkit.getDefaultToolkit();
        var image: java.awt.Image 
            = toolkit.getImage(new URL("{__DIR__}cursor.gif"));
        
        toolkit.createCustomCursor(image, new Point(7, 7), "MAGNIFIER");
    }
};

Frame {
    title: "CursorSample"
    width: 200
    height: 200
    closeAction: function() { 
        java.lang.System.exit( 0 ); 
    }
    visible: true

    stage: Stage {
        content: [
            Rectangle {
                cursor: cursor
                x: 10, y: 10
                width: 160, height: 140
                fill: Color.AQUAMARINE
            }            
        ]
    }
}

Toolkit の createCustomCursor メソッドの第 2 引数はカーソルがポイントする位置に対するオフセット、第 3 引数がこのカーソルの名前になります。

ちなみに (7, 7) は左上の円の中心になります。