JavaFX对图片上透明部分使用鼠标事件

对JAVAFX来说, 图片上的透明部分的任何鼠标事件都不能捕捉到,听起来有点像是bug, 比如下边这个对像你只能在其图片上不秀明部分触发鼠标事件:

ImageView {
x: 0;
y: 0;
image: Image { url: "{__DIR__}myImage.png"}
}


不过可以通过在增加层透明矩形层的方式来解决问题,因为Rectangle对象就算透明也会相应鼠标事件,如下代码所示

Rectangle {//Glass Pane
x: 0;
y: 0;
width: 20;
height: 20;
fill: Color.rgb(0, 0, 0, 0);
}


以下是个在窗口中拖动图片的例子,如图第一张图片只可以拖着不透明的地方拖动,第二张图片可以拖着任何地方(包括透明的部位)来拖动,完整的代码请符见下载(netbeans project)
[img]http://mqqqvpppm.iteye.com/upload/picture/pic/34811/b46b1841-6ce8-378d-b16a-7ec9445dfb3d.jpg[/img]


例子讲解:
Step1.先定义抽象类:

abstract class MyNode extends CustomNode{
var x: Number = 100;
var y: Number = 100;
var xTemp: Number =0;
var yTemp: Number =0;
var img = Image { url: "{__DIR__}myImage.png"};
}


Step2.定义两个子类来显示图片,其中一个多加了一层class pane (透明矩形)来触发鼠标事件
如下这个不带class pane:

class MyNodeWithoutGlassPane extends MyNode{
public override function create(): Node{
return Group {
content: [
ImageView {
x: bind x;
y: bind y;
image: img
}
Text{
x: bind x;
y: bind y;
content: "drag me on opaque part"
}
]
}
}
}


这个带有class pane:

class MyNodeWithGlassPane extends MyNode{

public override function create(): Node{
return Group {
content: [
// Background image
ImageView {
x: bind x;
y: bind y;
image: img;
}
Rectangle {//Glass Pane
x: bind x;
y: bind y;
width: img.width;
height: img.height;
fill: Color.rgb(0, 0, 0, 0);
}
Text{
x: bind x;
y: bind y;
content: "drag me even in transparent part"
}
]
};
}
}



Step3, 最后来写main部分,大体就是建出以上两个子类的对象来,给他们set上x,y做标值并对他们绑定数标事件(onMousePressed 和 onMouseDragged),代码如下

Stage {
scene: Scene {
content: [
MyNodeWithoutGlassPane{
x: 50;
y: 100;
onMousePressed: function(event){
var myNode = event.node as MyNode;
myNode.xTemp = myNode.x;
myNode.yTemp = myNode.y;
}
onMouseDragged: function(event){
var myNode = event.node as MyNode;
//println("{event.dragX} {event.dragY}");
myNode.x = myNode.xTemp + event.dragX;
myNode.y = myNode.yTemp + event.dragY
}
}
MyNodeWithGlassPane{
x: 250;
y: 250;
onMousePressed: function(event){
var myNode = event.node as MyNode;
myNode.xTemp = myNode.x;
myNode.yTemp = myNode.y;
}
onMouseDragged: function(event){
var myNode = event.node as MyNode;
//println("{event.dragX} {event.dragY}");
myNode.x = myNode.xTemp + event.dragX;
myNode.y = myNode.yTemp + event.dragY
}
}
]
}

width: 500
height: 500
title: "Drag Image"
resizable: false
}


完了谢谢阅读:) 祝大家愉快 ^^
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值