我正在尝试创建一个
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();
}
这是一种蛮力的方法,但我没有找到更好的方法.