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