2009年4月4日土曜日

JavaFXはじめました

RubyのためにNetBeans IDEをインストールしてあったので、SilverLightより先にJavaFX。
本家のチュートリアルを斜め読みしつつ、プラグインをインストールして環境構築完了。

ついにベールを脱いだJavaFXも参考になるかな?チラ見した。

非矩形フレーム、あるいは透明フレームをいただいてみた。JavaFX SDKのバージョンが違うから?そのままではビルドできなかったので。

JavaFXのAPIドキュメント。なんだか読みにくいよ。

ノーティファイアイコン(タスクトレイアイコンとかシステムトレイアイコンとも言う)を使いたいと思ったらこの記事も参考になるかも。

Main.fx
/*
* Main.fx
*
* Created on 2009/04/04, 17:16:02
*/

package javafxeyes;

import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.lang.Math;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

var rightX:Number;
var rightY:Number;
var leftX:Number;
var leftY:Number;
var strokeWidth: Number = 10;
var eyeRadius = bind strokeWidth;
var width = 150;
var height = 100;

var stage:Stage = Stage {
title: "JavaFXeyes"
width: bind width
height: bind height
style: StageStyle.TRANSPARENT
scene: Scene {
fill: null
content: [
Ellipse {
centerX: bind width / 4
centerY: bind height / 2
radiusX: bind width / 4 - strokeWidth / 2
radiusY: bind height / 2 - strokeWidth / 2
stroke: Color.BLACK
strokeWidth: bind strokeWidth
fill: null // Color.WHITE
onMouseDragged: moveStage
},
Circle {
centerX: bind leftX
centerY: bind leftY
radius: bind eyeRadius
fill: Color.BLACK
onMouseDragged: moveStage
},
Ellipse {
centerX: bind width / 4 * 3
centerY: bind height / 2
radiusX: bind width / 4 - strokeWidth / 2
radiusY: bind height / 2 - strokeWidth / 2
stroke: Color.BLACK
strokeWidth: bind strokeWidth
fill: null // Color.WHITE
onMouseDragged: moveStage
},
Circle {
centerX: bind rightX
centerY: bind rightY
radius: bind eyeRadius
fill: Color.BLACK
onMouseDragged: moveStage
}
]
}
}

Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames : [
KeyFrame {
time : 50ms
action: updateEyePosition
}
]
}.play();

function moveStage(event:MouseEvent):Void {
var x = event.dragX;
var y = event.dragY;
stage.x = stage.x + x;
stage.y = stage.y + y;
}

function calcEyePosition(x:Number, y:Number, cx:Number, cy:Number):Point {
var eyeX:Number = 0;
var eyeY:Number = 0;

var theta = Math.atan2(y - cy, x - cx);

var hr = width / 4 - strokeWidth - eyeRadius;
if(Math.abs(x - cx) > Math.abs(hr*Math.cos(theta))){
eyeX = cx + hr * Math.cos(theta);
} else {
eyeX = x;
}

var vr = height / 2 - strokeWidth - eyeRadius;
if(Math.abs(y - cy) > Math.abs(vr * Math.sin(theta))){
eyeY = height - cy - vr * Math.sin(theta);
} else {
eyeY = height - y;
}

return new Point(eyeX as Integer, eyeY as Integer);
}

function updateEyePosition():Void {
var point:PointerInfo = MouseInfo.getPointerInfo();
var x = point.getLocation().getX();
var y = point.getLocation().getY();
x = x - stage.x;
y = -y + stage.y + stage.height;
var p = calcEyePosition(x, y, width / 4, height / 2);
leftX = p.x;
leftY = p.y;
p = calcEyePosition(x, y, width / 4 * 3, height / 2);
rightX = p.x;
rightY = p.y;
}

jnlpでインストールする場合、マウスポインタの取得に(?本当かな?)セキュリティ制限が引っかかるので、securityで権限を与え、jarファイルに署名する必要があった。

JavaFXeyes.jnlp
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="file:///c:/Dev/" href="JavaFXeyes.jnlp">
<information>
<title>JavaFXeyes</title>
<vendor>Study JavaFX</vendor>
<icon href="icon.png"/>
<homepage href="http://takumakei.blogspot.com/"/>
<description>JavaFXeyes is the my first JavaFX program</description>
<offline-allowed/>
<shortcut>
<desktop/>
</shortcut>
</information>
<security>
<all-permissions/>
</security>

<resources>
<j2se version="1.5+"/>
<extension name="JavaFX Runtime" href="http://dl.javafx.com/1.1/javafx-rt.jnlp"/>
<jar href="JavaFXeyes.jar" main="true"/>
</resources>
<application-desc main-class="javafxeyes.Main">
</application-desc>
</jnlp>

自己署名証明書で署名する
C:\Dev>keytool -selfcert -alias myself -keystore myKeystore
C:\Dev>keytool -list -keystore myKeystore
C:\Dev>jarsigner -keystore myKeystore JavaFXeyes.jar myself

0 件のコメント:

コメントを投稿