When a control is translated outside of its original bounds, it no longer responds to mouse events (found when creating a draggable control). The following code reproduces the error:
package mousedragbug;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.paint.Color;
import javafx.scene.control.Control;
import javafx.scene.control.Skin;
import javafx.scene.control.Behavior;
import javafx.scene.input.MouseEvent;
class RectControl extends Control {
override var skin = RectControlSkin {}
}
class RectControlSkin extends Skin {
override var behavior = RectControlBehavior {}
init {
var rect:Rectangle = Rectangle {
width: 100
height: 100
fill: bind if (rect.hover) Color.LIGHTBLUE else Color.LIGHTGRAY
onMousePressed: function( me ) {
(behavior as RectControlBehavior).mousePress( me )
}
onMouseDragged: function( me ) {
(behavior as RectControlBehavior).mouseDrag( me )
}
}
node = rect
}
override function contains(localX:Number, localY:Number):Boolean {
return node.contains(localX, localY);
}
override function intersects(localX:Number, localY:Number, localWidth:Number, localHeight:Number):Boolean {
return node.intersects(localX, localY, localWidth, localHeight);
}
}
class RectControlBehavior extends Behavior {
var lastDragX = 0.0;
var lastDragY = 0.0;
public function mousePress( me:MouseEvent ) {
lastDragX = lastDragY = 0.0;
}
public function mouseDrag( me:MouseEvent ) {
skin.node.translateX += me.dragX - lastDragX;
skin.node.translateY += me.dragY - lastDragY;
lastDragX = me.dragX;
lastDragY = me.dragY;
}
}
Stage {
title: "Draggable Control Bug"
scene: Scene {
var lastDragX = 0.0;
var lastDragY = 0.0;
var draggable:Rectangle;
width: 400
height: 400
content: [
RectControl {}
// This rectangle just shows the original bounds of the control
Rectangle {
width: 100
height: 100
fill: Color.TRANSPARENT
stroke: Color.BLACK
strokeDashArray: [ 3, 5 ]
}
]
}
}
package mousedragbug;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.paint.Color;
import javafx.scene.control.Control;
import javafx.scene.control.Skin;
import javafx.scene.control.Behavior;
import javafx.scene.input.MouseEvent;
class RectControl extends Control {
override var skin = RectControlSkin {}
}
class RectControlSkin extends Skin {
override var behavior = RectControlBehavior {}
init {
var rect:Rectangle = Rectangle {
width: 100
height: 100
fill: bind if (rect.hover) Color.LIGHTBLUE else Color.LIGHTGRAY
onMousePressed: function( me ) {
(behavior as RectControlBehavior).mousePress( me )
}
onMouseDragged: function( me ) {
(behavior as RectControlBehavior).mouseDrag( me )
}
}
node = rect
}
override function contains(localX:Number, localY:Number):Boolean {
return node.contains(localX, localY);
}
override function intersects(localX:Number, localY:Number, localWidth:Number, localHeight:Number):Boolean {
return node.intersects(localX, localY, localWidth, localHeight);
}
}
class RectControlBehavior extends Behavior {
var lastDragX = 0.0;
var lastDragY = 0.0;
public function mousePress( me:MouseEvent ) {
lastDragX = lastDragY = 0.0;
}
public function mouseDrag( me:MouseEvent ) {
skin.node.translateX += me.dragX - lastDragX;
skin.node.translateY += me.dragY - lastDragY;
lastDragX = me.dragX;
lastDragY = me.dragY;
}
}
Stage {
title: "Draggable Control Bug"
scene: Scene {
var lastDragX = 0.0;
var lastDragY = 0.0;
var draggable:Rectangle;
width: 400
height: 400
content: [
RectControl {}
// This rectangle just shows the original bounds of the control
Rectangle {
width: 100
height: 100
fill: Color.TRANSPARENT
stroke: Color.BLACK
strokeDashArray: [ 3, 5 ]
}
]
}
}