我正在尝试制作一个 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 中,并且可以在次要版本之间进行更改(并且可以更改,请参阅下面的重命名)。
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();
}
这是一种蛮力方法,但我还没有找到更好的方法。
在 JavaFX 9 中,新的公共 API 添加到
Screen
类中:
对于 x 输出比例,文档如下:
获取该Screen在水平(X)方向的推荐输出比例因子。应将此比例因子应用于场景,以补偿输出设备的分辨率和观看距离。将相对于该比例因子报告视觉边界。
y 输出比例的操作类似。