1515import javafx .scene .paint .Color ;
1616import javafx .scene .shape .Rectangle ;
1717import javafx .stage .Screen ;
18+ import javafx .stage .Stage ;
1819import javafx .stage .Window ;
1920import net .miginfocom .layout .*;
2021
2122import java .util .ArrayList ;
2223import java .util .LinkedHashMap ;
2324import java .util .List ;
25+ import java .util .NoSuchElementException ;
2426
2527
2628/**
@@ -971,8 +973,8 @@ public int[] getVisualPadding()
971973 @ Override
972974 public int getHorizontalScreenDPI ()
973975 {
974- // todo All references to Screen.getPrimary() should be replaced with getting the actual screen the Node is on.
975- double dpi = Screen . getPrimary (). getDpi ();
976+ double dpi = getScreen (). getDpi ();
977+ // If the dpi value is unreasonable, use a somewhat sensible default
976978 if (dpi < 1.0 ) {
977979 dpi = 96.0 ;
978980 }
@@ -982,12 +984,16 @@ public int getHorizontalScreenDPI()
982984 @ Override
983985 public int getVerticalScreenDPI ()
984986 {
985- // todo All references to Screen.getPrimary() should be replaced with getting the actual screen the Node is on.
986- double dpi = Screen .getPrimary ().getDpi ();
987- if (dpi < 1.0 ) {
988- dpi = 96.0 ;
987+ // JavaFX only has one DPI factor.
988+ return getHorizontalScreenDPI ();
989+ }
990+
991+ private Screen getScreen () {
992+ Window window = node .getScene ().getWindow ();
993+ for (Screen screen : Screen .getScreensForRectangle (window .getX (), window .getY (), 1. , 1. )) {
994+ return screen ;
989995 }
990- return ( int ) Math . ceil ( dpi );
996+ return Screen . getPrimary ( );
991997 }
992998
993999 @ Override
0 commit comments