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

问题描述 投票:0回答:2

我正在尝试制作一个 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),并且我没有比例计算的规则。

java svg javafx-8
2个回答
1
投票

我为自己写了一个这样的辅助方法。

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();
}

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


0
投票

在 JavaFX 9 中,新的公共 API 添加到

Screen
类中:

对于 x 输出比例,文档如下:

获取该Screen在水平(X)方向的推荐输出比例因子。应将此比例因子应用于场景,以补偿输出设备的分辨率和观看距离。将相对于该比例因子报告视觉边界。

y 输出比例的操作类似。

© www.soinside.com 2019 - 2024. All rights reserved.