Since Java 8u60, JavaFX seems to implicitly scale all coordinates based on current system DPI.
For example if Windows DPI settings are changed from 100% (96 DPI) to 200% (192 DPI) JavaFX makes all components twice as large, as expected. This is true whether or not coordinates are given in em units or pixels.
However, Screen.getPrimary().getDpi()
still returns 96, probably because DPI of the screen hasn't actually changed, only system DPI settings.
How to get that system DPI value which is used by JavaFX to scale components?
The scaling is managed separeately, e.g. for 125% on Windows:
Screen screen = Screen.getPrimary();
double dpi = screen.getDpi();
double scaleX = screen.getOutputScaleX();
double scaleY = screen.getOutputScaleY();
System.out.println("DPI: " + dpi + " - scaleX: " + scaleX + " - scaleY: " + scaleY);
Output:
DPI: 96.0 - scaleX: 1.25 - scaleY: 1.25
EDIT Since Java 9!