仅使用公共API在JavaFX中获取屏幕比例

我正在尝试创建一个
JavaFX库,它将SVG文件显示为图像,适用于所有Java 8版本:
https://github.com/codecentric/javafxsvg

问题是它使用了java.fx.Screen的renderScale属性,它是私有的,在公共API中似乎没有直接或间接访问器.

在大多数情况下,该值为1.0f,对于Mac上的Retina显示,该值可以是2.0f.

com.sun.javafx.tk.quantum.QuantumToolkit.getMaxRenderScale();

这给出了我想要的值,但是在com.sun包中,因此不在公共API中,并且可以在次要版本之间更改(并且DO更改,请参阅下面的重命名).

com.sun.glass.ui.Screen.getRenderScale();

不在公共API中,并且在以前的版本中命名为getScale().

对此后续访问者进行相同的重命名,其目的是公开内部属性!

com.sun.javafx.stage.ScreenHelper.getScreenAccessor(Screen).getRenderScale();
// was ScreenHelper.getScreenAccessor(Screen).getScale()  in previous version

如果我使用这些内部API,它可以用于最后一个版本:1.8.0_74,但为某些先前版本(例如1.8.0_51)提供NoSuchMethodError.

我怎样才能使它适用于所有Java 8版本的jre?

请注意,我尝试了从dpi计算它的天真方法,但我应该只得到舍入值(1.0或2.0),我没有规模计算的规则.

最佳答案 我这样为自己写了一个帮助方法.

public static double getRenderScale(Screen screen) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    Method m;
    try {
        m = Screen.class.getDeclaredMethod("getScale"); // until 8u60 b15
    } catch (NoSuchMethodException e) {
        m = Screen.class.getDeclaredMethod("getRenderScale");
    }
    m.setAccessible(true);
    return ((Float) m.invoke(screen)).doubleValue();
}

这是一种蛮力的方法,但我没有找到更好的方法.

点赞