JDK-8123187 : Bogus Y-value in MouseEvent
  • Type: Bug
  • Component: javafx
  • Sub-Component: controls
  • Affected Version: 8
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2013-10-19
  • Updated: 2015-06-17
  • Resolved: 2013-10-25
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8Fixed
Related Reports
Relates :  
Description
double y I experience a strange problem:
Dragging a Shape (a derivative of Circle, in my case) "sometimes" results in bogus ordinate values.

I tried to reproduce in a very simple program, but there the error does NOT seem to happen.

In my real program, in a deeply nested Pane, I add, among other things a:

class SCircle extends Circle {
	...
	public SCircle(SPoint p) {
		super();
		...
		// mouse events
		addEventHandler(MouseEvent.DRAG_DETECTED, new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				dragging = true;
				tooltip.show(SCircle.this, getCenterX(), getCenterY()+2*RADIUS);
			}
		});
		addEventHandler(MouseEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				if (dragging && center != null) {				<----- BREAKPOINT HERE
					moveTo(event.getX(), event.getY());
				}
			}
		});
		addEventHandler(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				if (dragging) {
					if (center != null) {
						moveTo(event.getX(), event.getY());
					}
					tooltip.hide();
					dragging = false;
				}
			}
		});
		...
	}
	protected void moveTo(double x, double y) {
		StringBuilder sb = new StringBuilder();
		sb.append("moveTo(");
		sb.append(String.valueOf(x));
		sb.append(", ");
		sb.append(String.valueOf(y));
		sb.append("): ");
		switch (center.getConstraint()) {
		case FIX:
			sb.append("FIX!");
			break;
		case FIXX:
			sb.append("FIXX");
			center.setY(y);
			break;
		case FIXY:
			sb.append("FIXY");
			center.setX(x);
			break;
		case NONE:
			sb.append("done");
			center.setX(x);
			center.setY(y);
			break;
		}
		LOGGER.trace(sb.toString());
		setTooltipString();
	}

	...
}

Here I experience several malfunctions, main one is that "sometimes" (roughly one in five) I get completely bogus values with event.getY(), i.e.: values way out off the screen.
Typical printout (print is in moveTo(), but breakpointing shows bogus value is already in event.y) follows:

2013-10-19 14:43:01 TRACE SPoint:99 - setX(153.0): done.
2013-10-19 14:43:01 TRACE SPoint:133 - setY(179.0): done.
2013-10-19 14:43:01 TRACE SCircle:199 - moveTo(153.0, 179.0): done
2013-10-19 14:43:01 TRACE SPoint:99 - setX(145.0): done.
2013-10-19 14:43:01 TRACE SPoint:133 - setY(163.0): done.
2013-10-19 14:43:01 TRACE SCircle:199 - moveTo(145.0, 163.0): done
2013-10-19 14:43:01 TRACE SPoint:99 - setX(145.0): done.
2013-10-19 14:43:01 TRACE SPoint:133 - setY(160.0): done.
2013-10-19 14:43:01 TRACE SCircle:199 - moveTo(145.0, 160.0): done
2013-10-19 15:03:12 TRACE SPoint:99 - setX(144.0): done.
2013-10-19 15:03:12 TRACE SPoint:133 - setY(-2066.0): [clipping Y UP to 50.0] done.
2013-10-19 15:03:12 TRACE SCircle:199 - moveTo(144.0, -2066.0): done
2013-10-19 15:03:12 TRACE SPoint:99 - setX(132.0): done.
2013-10-19 15:03:12 TRACE SPoint:133 - setY(127.0): done.
2013-10-19 15:03:12 TRACE SCircle:199 - moveTo(132.0, 127.0): done
2013-10-19 15:03:12 TRACE SPoint:99 - setX(132.0): done.
2013-10-19 15:03:12 TRACE SPoint:133 - setY(-2098.0): [clipping Y UP to 50.0] done.
2013-10-19 15:03:12 TRACE SCircle:199 - moveTo(132.0, -2098.0): done
2013-10-19 15:03:35 TRACE SPoint:99 - setX(248.0): done.
2013-10-19 15:03:35 TRACE SPoint:133 - setY(127.0): done.
2013-10-19 15:03:35 TRACE SCircle:199 - moveTo(248.0, 127.0): done
2013-10-19 15:03:35 TRACE SPoint:99 - setX(248.0): done.
2013-10-19 15:03:35 TRACE SPoint:133 - setY(-2097.0): [clipping Y UP to 50.0] done.
2013-10-19 15:03:35 TRACE SCircle:199 - moveTo(248.0, -2097.0): done
2013-10-19 15:03:35 TRACE SPoint:99 - setX(248.0): done.
2013-10-19 15:03:35 TRACE SPoint:133 - setY(131.0): done.
2013-10-19 15:03:35 TRACE SCircle:199 - moveTo(248.0, 131.0): done
2013-10-19 15:03:35 TRACE SPoint:99 - setX(248.0): done.
2013-10-19 15:03:35 TRACE SPoint:133 - setY(135.0): done.
2013-10-19 15:03:35 TRACE SCircle:199 - moveTo(248.0, 135.0): done

I am aware this is not a "proper" bug report, but I am currently unable to debug this further (and it is obviously very annoying!).
As said I tried a very small program dragging a Circle around, but that does NOT show the malfunction.
Can someone suggest how to better trace the error so it can be fixed?
Comments
I think it should be in b114.
06-11-2013

Pavel, b114 or b115?
06-11-2013

It should be integrated into master today. This integration happens weekly, the work is done on scrum clones. In this case it's http://hg.openjdk.java.net/openjfx/8/graphics/rt
29-10-2013

It seems changeset is not present in latest ea-b113. When will it be available? This is strange: I can't see changeset 1490b7a04271 on http://hg.openjdk.java.net/openjfx/8/master/rt Where should it be? Is it on some branch?
29-10-2013

Fixed by changeset 1490b7a04271. A boolean sizeInvalid flag used instead of the problematic values of -1. No unit tests as this was a race condition.
25-10-2013

1. The node is dragged so something really changes. 2. Scrolling positions depend on content size, when the content size is -1, the viewContent position is computed wrong. But don't worry, I already issued a fix for review, I'll probably push the fix tomorrow.
24-10-2013

I do not really understand all this code, but: 1) why is layout unconditionally requested? shouldn't it be called only if something inside really changes? 2) child positions should only depend on ScrollPane offsets, while viewContent() resets only sizes, why are children affected? clipping? in this case a simple conditional could avoid clipping if size is invalid (i.e.: "-1").
24-10-2013

The ScrollPaneSkin's viewContent has a requestLayout method which sets content sizes to -1 in order to recompute them in layoutChildren. However, layoutChildren is not called synchronously but only on pulse so there is a short window with the wrong values.
24-10-2013

I'm already tracking it down. It is indeed a bug in ScrollPane. For some reason it sometimes fails to update the content's sizes and computes with width == heigh == -1 which results in completely wrong scrolling position.
24-10-2013

I slightly modified Your minimal example making it symmetrical with respect to the axes. Unsurprisingly "bogus" coordinates appear also in X as soon as the ScrollPane is scrolled horizontally. Interesting is "bogus" points always have BOTH coordinates wrong; i.e.: something breaks both translations, they are NOT independent. HiH
24-10-2013

Thanks for trying. Based on your latest findings, I've been able to create a minimal reproducer. Attached DraggingInScrollPane.java (scroll to the circle and drag it, the bogus events will come). No more work is needed from you now.
24-10-2013

It seems to me there's some problem with a ScrollPane. I changed the handler to always print the Y-coordinates as transformed: public void handle(MouseEvent event) { if (dragging && center != null) { { Point2D pt = localToScene(event.getX(), event.getY()); String h = (event.getY() < 0)? "Bogus": "Good "; System.out.println(h+" point ("+event.getX()+";"+event.getY()+")\t-- in Scene coordinates: ("+pt+")\t-- center is: ("+center.getY()+")"); /*if (event.getY() < 0)*/ { h = "-------------> "; Object o = event.getSource(); while (true) { if (o instanceof Node) { Node n = (Node) o; pt = n.localToParent(0,0); String s = String.format("(%s)[%.1f]", n.getClass().getSimpleName(), pt.getY()); System.out.print(h+s); h = ",\t"; o = n.getParent(); } else { System.out.println(); break; } } } } moveTo(event.getX(), event.getY()); } } This results in the following printout: Good point (150.0;52.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 372.0]) -- center is: (50.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[-883,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] Bogus point (150.0;-1066.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 375.0]) -- center is: (52.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[238,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] Bogus point (150.0;-1063.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 378.0]) -- center is: (50.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[238,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] Good point (150.0;59.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 379.0]) -- center is: (50.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[-883,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] Bogus point (150.0;-1061.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 380.0]) -- center is: (59.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[238,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] Good point (150.0;64.0) -- in Scene coordinates: (Point2D [x = 1320.0, y = 384.0]) -- center is: (50.0) -------------> (SCircle)[0,0], (SPoly)[0,0], (Pane)[43,0], (VBox)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[420,0], (GridPane)[0,0], (Content)[0,0], ()[31,0], (TitledPane)[569,0], (GridPane)[0,0], ()[-883,0], ()[0,0], (ScrollPane)[30,0], (BorderPane)[0,0], (Content)[1,0], (SplitPane)[0,0], (AnchorPane)[0,0], (Content)[1,0], (SplitPane)[77,0], (BorderPane)[0,0] note that: vvvvv Good -> ... (GridPane)[0,0], ()[-883,0], ()[0,0], (ScrollPane)[30,0], ... Bogus -> ... (GridPane)[0,0], ()[238,0], ()[0,0], (ScrollPane)[30,0], ... I assume the nameless classes are defined inline in the father (ScrollPane, in this case). Numbers are consistent because where I'm looking at the pane is way down the ScrollPane, so it is consistent to have a negative Y translation. This also explains why I don't see the misbehavior on X-axis: my scene horizontally fits into the screen, so no translation is necessary. I have no idea why SOMETIMES translation fails. Note there should be no layout changing. I'm "just" moving a shape in a Pane; nothing should change in upper layers. Can You suggest further tests? Thanks. UPDATE: I moved the TitledPane near to the top of the ScrollPane (I actually placed a copy there). Misbehavior ONLY happens if ScrollPane top is not visible (i.e.: if it is actually scrolled down). If ScrollPane is at its topmost position (no Y displacement) I don't see "Bogus" points.
24-10-2013

There might be some problem with layouts. As the next step, I suggest the following: in the time of the bogus point 1. Just for sure, check that the SCirle's center is alright 2. If so, somewhere must be the transform (translate or layout). The most robust way to check would probably be - create a loop starting at SCircle and running over the parent nodes. On each of the nodes, call localToParent(0, 0) and see if the result significantly transformed the Y value. This way you should find the problematic node. Now see: - what does its getTranslateY() say? - what does its getLayoutY() say? - what does its getTransforms() say? - who is its parent (which may have caused the buggy layout)?
23-10-2013

Hi Pavel, I modified the handler as follows: public void handle(MouseEvent event) { if (dragging && center != null) { { Point2D p = localToScene(event.getX(), event.getY()); String h = (event.getY() < 0)? "Bogus": "Good "; System.out.println(h+" point ("+event.getX()+";"+event.getY()+")\t-- in Scene coordinates: ("+p+")"); } moveTo(event.getX(), event.getY()); } } Results (below) seem to indicate some strange translation since values in Scene coordinates seem ok. Note I'm not using any explicit Transform, I just place Parents one into another. Between calls The only thing I do is to move SCircle center using center.setX() and center.setY(), after a bit of clipping (i.e.: i might NOT move the center if coordinates look wrong, I will NOT change the coordinates by clipping!). Circle Center[X|Y]Properties are bound to center[X|Y], so the graphics moves. There seems to be some bad interaction along the chain; what can I do to pinpoint the issue? Problem is the working is erratic, suggesting some kind of "critical window", but I'm not explicitly using multithreading. I might have done something wrong, but this still seems a JavaFX issue, somewhere. I am obviously willing to help debugging this. TiA Mauro Good point (196.0;120.0) -- in Scene coordinates: (Point2D [x = 1312.0, y = 361.0]) Good point (196.0;121.0) -- in Scene coordinates: (Point2D [x = 1312.0, y = 362.0]) Good point (196.0;122.0) -- in Scene coordinates: (Point2D [x = 1312.0, y = 363.0]) Good point (196.0;123.0) -- in Scene coordinates: (Point2D [x = 1312.0, y = 364.0]) Good point (196.0;124.0) -- in Scene coordinates: (Point2D [x = 1312.0, y = 365.0]) Good point (195.0;126.0) -- in Scene coordinates: (Point2D [x = 1311.0, y = 367.0]) Good point (195.0;127.0) -- in Scene coordinates: (Point2D [x = 1311.0, y = 368.0]) Good point (194.0;129.0) -- in Scene coordinates: (Point2D [x = 1310.0, y = 370.0]) Good point (193.0;129.0) -- in Scene coordinates: (Point2D [x = 1309.0, y = 370.0]) Good point (192.0;130.0) -- in Scene coordinates: (Point2D [x = 1308.0, y = 371.0]) Good point (192.0;131.0) -- in Scene coordinates: (Point2D [x = 1308.0, y = 372.0]) Good point (192.0;132.0) -- in Scene coordinates: (Point2D [x = 1308.0, y = 373.0]) Good point (190.0;132.0) -- in Scene coordinates: (Point2D [x = 1306.0, y = 373.0]) Bogus point (189.0;-1100.0) -- in Scene coordinates: (Point2D [x = 1305.0, y = 373.0]) Bogus point (188.0;-1100.0) -- in Scene coordinates: (Point2D [x = 1304.0, y = 373.0]) Good point (186.0;132.0) -- in Scene coordinates: (Point2D [x = 1302.0, y = 373.0]) Good point (185.0;132.0) -- in Scene coordinates: (Point2D [x = 1301.0, y = 373.0]) Good point (184.0;132.0) -- in Scene coordinates: (Point2D [x = 1300.0, y = 373.0]) Good point (183.0;132.0) -- in Scene coordinates: (Point2D [x = 1299.0, y = 373.0]) Good point (182.0;131.0) -- in Scene coordinates: (Point2D [x = 1298.0, y = 372.0]) Good point (180.0;131.0) -- in Scene coordinates: (Point2D [x = 1296.0, y = 372.0]) Good point (179.0;130.0) -- in Scene coordinates: (Point2D [x = 1295.0, y = 371.0]) Good point (177.0;129.0) -- in Scene coordinates: (Point2D [x = 1293.0, y = 370.0]) Good point (176.0;128.0) -- in Scene coordinates: (Point2D [x = 1292.0, y = 369.0]) Good point (175.0;127.0) -- in Scene coordinates: (Point2D [x = 1291.0, y = 368.0]) Good point (174.0;127.0) -- in Scene coordinates: (Point2D [x = 1290.0, y = 368.0]) Good point (174.0;126.0) -- in Scene coordinates: (Point2D [x = 1290.0, y = 367.0]) Good point (174.0;125.0) -- in Scene coordinates: (Point2D [x = 1290.0, y = 366.0]) Good point (173.0;125.0) -- in Scene coordinates: (Point2D [x = 1289.0, y = 366.0]) Good point (172.0;124.0) -- in Scene coordinates: (Point2D [x = 1288.0, y = 365.0]) Bogus point (171.0;-1109.0) -- in Scene coordinates: (Point2D [x = 1287.0, y = 364.0]) Good point (171.0;122.0) -- in Scene coordinates: (Point2D [x = 1287.0, y = 363.0]) Good point (170.0;121.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 362.0]) Bogus point (170.0;-1112.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 361.0]) Good point (170.0;119.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 360.0]) Good point (170.0;117.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 358.0]) Good point (170.0;116.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 357.0]) Good point (170.0;115.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 356.0]) Good point (170.0;114.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 355.0]) Good point (170.0;113.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 354.0]) Good point (170.0;111.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 352.0]) Good point (170.0;110.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 351.0]) Good point (170.0;109.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 350.0]) Good point (170.0;107.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 348.0]) Good point (170.0;106.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 347.0]) Good point (170.0;105.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 346.0]) Good point (170.0;104.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 345.0]) Good point (170.0;103.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 344.0]) Good point (170.0;102.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 343.0]) Good point (170.0;100.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 341.0]) Good point (170.0;99.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 340.0]) Good point (170.0;98.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 339.0]) Good point (170.0;97.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 338.0]) Good point (170.0;95.0) -- in Scene coordinates: (Point2D [x = 1286.0, y = 336.0]) Good point (171.0;95.0) -- in Scene coordinates: (Point2D [x = 1287.0, y = 336.0]) Good point (172.0;95.0) -- in Scene coordinates: (Point2D [x = 1288.0, y = 336.0]) Good point (173.0;95.0) -- in Scene coordinates: (Point2D [x = 1289.0, y = 336.0]) Bogus point (174.0;-1137.0) -- in Scene coordinates: (Point2D [x = 1290.0, y = 336.0]) Good point (176.0;93.0) -- in Scene coordinates: (Point2D [x = 1292.0, y = 334.0]) Bogus point (178.0;-1139.0) -- in Scene coordinates: (Point2D [x = 1294.0, y = 334.0]) Bogus point (179.0;-1139.0) -- in Scene coordinates: (Point2D [x = 1295.0, y = 334.0]) Good point (180.0;92.0) -- in Scene coordinates: (Point2D [x = 1296.0, y = 333.0]) Good point (181.0;91.0) -- in Scene coordinates: (Point2D [x = 1297.0, y = 332.0]) Good point (182.0;91.0) -- in Scene coordinates: (Point2D [x = 1298.0, y = 332.0]) Good point (183.0;91.0) -- in Scene coordinates: (Point2D [x = 1299.0, y = 332.0]) Good point (184.0;90.0) -- in Scene coordinates: (Point2D [x = 1300.0, y = 331.0]) Good point (185.0;90.0) -- in Scene coordinates: (Point2D [x = 1301.0, y = 331.0]) Good point (186.0;90.0) -- in Scene coordinates: (Point2D [x = 1302.0, y = 331.0]) Good point (187.0;90.0) -- in Scene coordinates: (Point2D [x = 1303.0, y = 331.0]) Good point (188.0;89.0) -- in Scene coordinates: (Point2D [x = 1304.0, y = 330.0]) Good point (189.0;88.0) -- in Scene coordinates: (Point2D [x = 1305.0, y = 329.0]) Good point (190.0;88.0) -- in Scene coordinates: (Point2D [x = 1306.0, y = 329.0]) Good point (191.0;87.0) -- in Scene coordinates: (Point2D [x = 1307.0, y = 328.0]) Good point (193.0;87.0) -- in Scene coordinates: (Point2D [x = 1309.0, y = 328.0]) Good point (195.0;87.0) -- in Scene coordinates: (Point2D [x = 1311.0, y = 328.0]) Good point (197.0;86.0) -- in Scene coordinates: (Point2D [x = 1313.0, y = 327.0]) Good point (199.0;85.0) -- in Scene coordinates: (Point2D [x = 1315.0, y = 326.0]) Good point (201.0;84.0) -- in Scene coordinates: (Point2D [x = 1317.0, y = 325.0]) Good point (202.0;84.0) -- in Scene coordinates: (Point2D [x = 1318.0, y = 325.0]) Good point (205.0;82.0) -- in Scene coordinates: (Point2D [x = 1321.0, y = 323.0]) Bogus point (206.0;-1150.0) -- in Scene coordinates: (Point2D [x = 1322.0, y = 323.0]) Bogus point (208.0;-1151.0) -- in Scene coordinates: (Point2D [x = 1324.0, y = 322.0]) Good point (210.0;81.0) -- in Scene coordinates: (Point2D [x = 1326.0, y = 322.0]) Bogus point (211.0;-1151.0) -- in Scene coordinates: (Point2D [x = 1327.0, y = 322.0]) Good point (214.0;81.0) -- in Scene coordinates: (Point2D [x = 1330.0, y = 322.0]) Bogus point (215.0;-1151.0) -- in Scene coordinates: (Point2D [x = 1331.0, y = 322.0]) Good point (217.0;80.0) -- in Scene coordinates: (Point2D [x = 1333.0, y = 321.0]) Good point (219.0;80.0) -- in Scene coordinates: (Point2D [x = 1335.0, y = 321.0])
23-10-2013

Hello, first thing to try - in the place of the breakpoint, try to call localToScene(event.getX(), event.getY()). If it returns reasonable scene coordinates, then check transforms you have on the SCircle and its parents at this time, perhaps some of them is a huge translateY. If the value, however, does not match the scene coordinates, then we need to start looking for a platform bug or a threading problem in the app.
23-10-2013