如何确定我的程序是否在Retina屏幕上运行

时间:2015-03-02 19:01:00

标签: javafx dpi retina

如何可靠地确定我的JavaFX程序是否在视网膜设备上运行以及使用了什么像素缩放比例。调用类似

的内容
System.out.println(Screen.getPrimary().getDpi());

在我的Mac上只返回110。这正是实际物理dpis的一半,因此Screen类提供的信息毫无用处。

还有其他方法可以找出我要找的东西吗?

迈克尔

1 个答案:

答案 0 :(得分:2)

我想我现在可以回答我自己的问题了。在官方网站上似乎没有任何方法可以找出屏幕的物理DPI。唯一的方法似乎是使用一些私有API,如下例所示:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class PixelScaleTest extends Application {

    public static double getPixelScale(Screen screen) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Method m = Screen.class.getDeclaredMethod("getScale");
        m.setAccessible(true);
        return ((Float) m.invoke(screen)).doubleValue();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        try {
            System.out.println("PixelScale: " + getPixelScale(Screen.getPrimary()));
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
                | SecurityException e) {
            e.printStackTrace();
        }
        Platform.exit();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

使用像素比例因子,您可以计算物理DPI。在标准屏幕上,此因子应为1.0,在Mac Retina上应为2.0。