38
38
import java .awt .EventQueue ;
39
39
import java .awt .SecondaryLoop ;
40
40
import java .awt .GraphicsEnvironment ;
41
+ import java .awt .GraphicsConfiguration ;
42
+ import java .awt .Rectangle ;
41
43
import java .awt .event .AWTEventListener ;
42
44
import java .awt .event .ComponentEvent ;
43
45
import java .awt .event .FocusEvent ;
48
50
import java .awt .event .MouseEvent ;
49
51
import java .awt .event .MouseWheelEvent ;
50
52
import java .awt .event .InvocationEvent ;
53
+ import java .awt .geom .AffineTransform ;
51
54
import java .awt .im .InputMethodRequests ;
52
55
import java .awt .image .BufferedImage ;
53
56
import java .awt .image .DataBufferInt ;
59
62
import javax .swing .SwingUtilities ;
60
63
61
64
import javafx .application .Platform ;
65
+ import javafx .geometry .Point2D ;
62
66
import javafx .scene .Scene ;
67
+ import com .sun .glass .ui .Screen ;
63
68
64
69
import com .sun .javafx .application .PlatformImpl ;
65
70
import com .sun .javafx .cursor .CursorFrame ;
@@ -362,6 +367,44 @@ public final boolean isOpaque() {
362
367
return false ;
363
368
}
364
369
370
+ // we need to know the JavaFX screen of the current AWT graphcisConfiguration
371
+ private Screen findScreen (GraphicsConfiguration graphicsConfiguration ) {
372
+ Rectangle awtBounds = graphicsConfiguration .getBounds ();
373
+ AffineTransform awtScales = graphicsConfiguration .getDefaultTransform ();
374
+ for (Screen screen : Screen .getScreens ()) {
375
+ if ((Math .abs (screen .getPlatformX () - awtBounds .getX ()) < 2. ) &&
376
+ (Math .abs (screen .getPlatformY () - awtBounds .getY ()) < 2. ) &&
377
+ (Math .abs (screen .getPlatformWidth () - awtScales .getScaleX () * awtBounds .getWidth ()) < 2. ) &&
378
+ (Math .abs (screen .getPlatformHeight () - awtScales .getScaleY () * awtBounds .getHeight ()) < 2. )) {
379
+ return screen ;
380
+ }
381
+ }
382
+ return null ;
383
+ }
384
+
385
+ private Point2D convertSwingToFxPixel (GraphicsConfiguration g , double wx , double wy ) {
386
+ double newx , newy ;
387
+ Screen screen = findScreen (g );
388
+ if (screen != null ) {
389
+ AffineTransform awtScales = getGraphicsConfiguration ().getDefaultTransform ();
390
+ float pScaleX = screen .getPlatformScaleX ();
391
+ float pScaleY = screen .getPlatformScaleY ();
392
+ int sx = screen .getX ();
393
+ int sy = screen .getY ();
394
+ double awtScaleX = awtScales .getScaleX ();
395
+ double awtScaleY = awtScales .getScaleY ();
396
+
397
+ int px = screen .getPlatformX ();
398
+ int py = screen .getPlatformY ();
399
+ newx = sx + (wx - px ) * awtScaleX / pScaleX ;
400
+ newy = sy + (wy - py ) * awtScaleY / pScaleY ;
401
+ } else {
402
+ newx = wx ;
403
+ newy = wy ;
404
+ }
405
+ return new Point2D (newx , newy );
406
+ }
407
+
365
408
private void sendMouseEventToFX (MouseEvent e ) {
366
409
if (scenePeer == null || !isFxEnabled ()) {
367
410
return ;
@@ -407,14 +450,17 @@ private void sendMouseEventToFX(MouseEvent e) {
407
450
if (e .getID () == MouseEvent .MOUSE_PRESSED || e .getID () == MouseEvent .MOUSE_RELEASED ) {
408
451
popupTrigger = e .isPopupTrigger ();
409
452
}
453
+ Point2D onScreen = convertSwingToFxPixel (getGraphicsConfiguration (), e .getXOnScreen (), e .getYOnScreen ());
454
+ int fxXOnScreen = (int )Math .round (onScreen .getX ());
455
+ int fxYOnScreen = (int )Math .round (onScreen .getY ());
410
456
411
457
if (e .getID () == MouseEvent .MOUSE_WHEEL ) {
412
458
scenePeer .scrollEvent (AbstractEvents .MOUSEEVENT_VERTICAL_WHEEL ,
413
459
0 , -SwingEvents .getWheelRotation (e ),
414
460
0 , 0 , // total scroll
415
461
40 , 40 , // multiplier
416
462
e .getX (), e .getY (),
417
- e . getXOnScreen (), e . getYOnScreen () ,
463
+ fxXOnScreen , fxYOnScreen ,
418
464
(extModifiers & MouseEvent .SHIFT_DOWN_MASK ) != 0 ,
419
465
(extModifiers & MouseEvent .CTRL_DOWN_MASK ) != 0 ,
420
466
(extModifiers & MouseEvent .ALT_DOWN_MASK ) != 0 ,
@@ -425,15 +471,16 @@ private void sendMouseEventToFX(MouseEvent e) {
425
471
SwingEvents .mouseButtonToEmbedMouseButton (e .getButton (), extModifiers ),
426
472
primaryBtnDown , middleBtnDown , secondaryBtnDown ,
427
473
backBtnDown , forwardBtnDown ,
428
- e .getX (), e .getY (), e .getXOnScreen (), e .getYOnScreen (),
474
+ e .getX (), e .getY (),
475
+ fxXOnScreen , fxYOnScreen ,
429
476
(extModifiers & MouseEvent .SHIFT_DOWN_MASK ) != 0 ,
430
477
(extModifiers & MouseEvent .CTRL_DOWN_MASK ) != 0 ,
431
478
(extModifiers & MouseEvent .ALT_DOWN_MASK ) != 0 ,
432
479
(extModifiers & MouseEvent .META_DOWN_MASK ) != 0 ,
433
480
popupTrigger );
434
481
}
435
482
if (e .isPopupTrigger ()) {
436
- scenePeer .menuEvent (e .getX (), e .getY (), e . getXOnScreen (), e . getYOnScreen () , false );
483
+ scenePeer .menuEvent (e .getX (), e .getY (), fxXOnScreen , fxYOnScreen , false );
437
484
}
438
485
}
439
486
@@ -598,8 +645,9 @@ private boolean updateScreenLocation() {
598
645
synchronized (getTreeLock ()) {
599
646
if (isShowing ()) {
600
647
Point p = getLocationOnScreen ();
601
- screenX = p .x ;
602
- screenY = p .y ;
648
+ Point2D fxcoord = convertSwingToFxPixel (getGraphicsConfiguration (), p .x , p .y );
649
+ screenX = (int )Math .round (fxcoord .getX ());
650
+ screenY = (int )Math .round (fxcoord .getY ());
603
651
return true ;
604
652
}
605
653
}
0 commit comments