Javafx 如何确定我的程序是否在视网膜屏幕上运行

Javafx 如何确定我的程序是否在视网膜屏幕上运行,javafx,dpi,retina,Javafx,Dpi,Retina,我如何才能可靠地确定我的JavaFX程序是否在视网膜设备上运行,以及使用了什么样的像素比例。打电话给 System.out.println(Screen.getPrimary().getDpi()); 在我的Mac上返回110。这正好是实际物理DPI的一半,因此Screen类提供的信息非常无用 有没有其他方法可以知道我在找什么 迈克尔我想我现在可以回答我自己的问题了。官方看来,似乎没有任何方法可以确定屏幕的物理DPI是什么。唯一的方法似乎是使用一些私有API,如以下示例所示: import j

我如何才能可靠地确定我的JavaFX程序是否在视网膜设备上运行,以及使用了什么样的像素比例。打电话给

System.out.println(Screen.getPrimary().getDpi());
在我的Mac上返回110。这正好是实际物理DPI的一半,因此Screen类提供的信息非常无用

有没有其他方法可以知道我在找什么


迈克尔

我想我现在可以回答我自己的问题了。官方看来,似乎没有任何方法可以确定屏幕的物理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。

您使用的java版本是什么?啊,好吧,也许您已经在这篇新文章中找到了一些提示,但我还没有在其中找到任何提示。不过还是要谢谢你。启动JavaFX9时,请使用屏幕上的或方法。@ItachiUchiha是的,我知道,但谢谢你在这里指出这一点。从JavaFX9开始,有一个新的公共API使这个问题和答案过时了。我不认为这个问题过时了。此外,因子仍然为2,因此答案也部分有效。您可能希望使用JavaFX9替代方案更新您的答案;)这在我的Mac上的Java8上不起作用。我得到了
java.lang.NoSuchMethodException:javafx.stage.Screen.getScale()
如今,在编写javafx应用程序时,谁还关心Java8?