2008年7月26日土曜日

基本的なマウス入力の見本


同じく、NetBeans 6.1用JavaFX追加接続(Plugin)プログラムに付属している見本を参考に、基本的なマウス入力応用プログラムの見本を作ってみました。
実行すると、図のように、マウス指示器の座標と押されたマウス ボタンの番号(一番左のボタンが1。押されていないときは0)が、マウス指示器に追随して表示されます(それ用の画像取り込み用具を使っていないので、肝心のマウス指示器の画像を取り込めていませんが、あしからず)。空色の矩形の中にマウスを移動すると、矩形が半透明で表示されます。
次に、コードを示します。

package deviceInput;

import javafx.application.Frame;
import javafx.application.Stage;
import javafx.input.MouseEvent;
import javafx.scene.Group;
import javafx.scene.geometry.Rectangle;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextOrigin;
import javafx.scene.transform.Translate;

import java.lang.System;

Frame {
var mouseEvent: MouseEvent;
title: "Mouse Input"
width: 400
height: 332
visible: true
closeAction: function(): Void {
System.exit(0);
}
stage: Stage {
width: 400
height: 300
content: [
Rectangle {
x: 50, y: 50
width: 300, height: 200
fill: Color.LIGHTGRAY
onMousePressed: function(ev: MouseEvent): Void {
mouseEvent = ev;
}
onMouseClicked: function(ev: MouseEvent): Void {
mouseEvent = ev;
}
onMouseReleased: function(ev: MouseEvent): Void {
mouseEvent = ev;
}
onMouseMoved: function(ev: MouseEvent): Void {
mouseEvent = ev;
}
},
Rectangle {
x: 150, y: 100
width: 100, height: 100
fill: Color.SKYBLUE
onMouseEntered: function(ev: MouseEvent): Void {
ev.node.opacity = 0.5;
}
onMouseExited: function(ev: MouseEvent): Void {
ev.node.opacity = 1.0;
}
},
Group {
transform : Translate {x: bind mouseEvent.getX() + 20,
y: bind mouseEvent.getY()}
content : [
Text {
textOrigin: TextOrigin.TOP
fill: Color.RED
content: "StageX:"
},
Text {
translateX: 45
textOrigin: TextOrigin.TOP
fill: Color.RED
content: bind "{mouseEvent.getStageX() as Integer}"
},
Text {
translateX: 80
textOrigin: TextOrigin.TOP
fill: Color.RED
content: "StageY:"
},
Text {
translateX: 125
textOrigin: TextOrigin.TOP
fill: Color.RED
content: bind "{mouseEvent.getStageY() as Integer}"
},
Text {
translateY: 15
textOrigin: TextOrigin.TOP
fill: Color.RED
content: "X:"
},
Text {
translateX: 15, translateY: 15
textOrigin: TextOrigin.TOP
fill: Color.RED
content: bind "{mouseEvent.getX() as Integer}"
},
Text {
translateX: 50, translateY: 15
textOrigin: TextOrigin.TOP
fill: Color.RED
content: "Y:"
},
Text {
translateX: 65, translateY: 15
textOrigin: TextOrigin.TOP
fill: Color.RED
content: bind "{mouseEvent.getY() as Integer}"
},
Text {
translateY: 30
textOrigin: TextOrigin.TOP
fill: Color.RED
content: "Button:"
},
Text {
translateX: 40, translateY: 30
textOrigin: TextOrigin.TOP
fill: Color.RED
content: bind "{mouseEvent.getButton()}"
}
]
}
]
}
}

マウス事象は、その
事象が発生した図式の節(graph node。見本コードでは、Rectangleオブジェクトを使用している)の、事象属性onXxxYyyに定義した呼び戻し関数を用いて取得します。マウス事象から、マウスの座標やボタン開閉器の番号などの情報が得られます。詳しいことは、JavaFX APIを参照してください。
なお、図からもわかりますが、現状(2008/07/23現在の日々構築版追加接続プログラム)では、入力される座標に、一部不具合があるようです。マウス事象が発生した節の原点に対する相対位置を返す関数getX()/getY()は、その節を含むStageの原点に関する相対位置を返すgetStageX()/getStageY()と同じ値を返してしまいます(画面上の絶対位置を返すgetScreenX()/getScreenY()は、正常に機能しています)。

0 件のコメント: