Here is a problem I faced those days while programming with JavaFX.
When you perform a click in a JavaFX area, mouse events are called to all nodes through that position. You can see this behavior in this video.
Example 1.
Here is the code.
import javafx.application.*;
import javafx.scene.geometry.*;
import javafx.scene.geometry.Rectangle;
import javafx.scene.paint.Color;
import javafx.input.MouseEvent;
Frame {
width: 200
height: 200
visible: true
stage: Stage {
content: [
Rectangle {
var color1 = Color.BLUE;
x: 10, y: 10, width: 140, height: 90, fill: bind color1
onMouseClicked: function( e: MouseEvent ):Void {
if (color1==Color.BLUE){
color1 = Color.GREEN;
} else {
color1 = Color.BLUE
}
}
},
Circle {
var color2 = Color.RED
centerX: 100, centerY: 100, radius: 40, fill: bind color2
onMouseClicked: function( e: MouseEvent ):Void {
if (color2==Color.YELLOW){
color2 = Color.RED;
} else {
color2 = Color.YELLOW
}
}
}
]
}
}
This is the default behavior. All node are called with a mouse event. Is a expected and robust behavior but sometimes we just don’t want that. We want events called to just one node or a set of nodes.
Example 2.
Is exactly the same code but with blocksMouse: true in the circle node. When blocksMouse is true the mouse event will not be called to others node behind it.
package overlapping;
import javafx.application.*;
import javafx.scene.geometry.*;
import javafx.scene.geometry.Rectangle;
import javafx.scene.paint.Color;
import javafx.input.MouseEvent;
Frame {
width: 200
height: 200
visible: true
stage: Stage {
content: [
Rectangle {
var color1 = Color.BLUE;
x: 10, y: 10, width: 140, height: 90, fill: bind color1
onMouseClicked: function( e: MouseEvent ):Void {
if (color1==Color.BLUE){
color1 = Color.GREEN;
} else {
color1 = Color.BLUE
}
}
},
Circle {
var color2 = Color.RED
centerX: 100, centerY: 100, radius: 40, fill: bind color2
blocksMouse: true
onMouseClicked: function( e: MouseEvent ):Void {
if (color2==Color.YELLOW){
color2 = Color.RED;
} else {
color2 = Color.YELLOW
}
}
}
]
}
}
Thanks guys on the OpenJDK user mail list and at OpenJFX Forum, specially this thread.
Be First to Comment