【问题标题】:How to get the screen resolution (getScreenResolution) when multiple monitors are in use?使用多台显示器时如何获取屏幕分辨率(getScreenResolution)?
【发布时间】:2016-07-05 23:21:34
【问题描述】:

我知道我可以调用Toolkit.getDefaultToolkit().getScreenResolution() 并获取默认屏幕的 DPI,但我无法找到一种方法来为我连接的其他显示器获取相同的信息。谁能告诉我如何为其他显示器获取Toolkit,或者在设备上调用以获取这些显示器的 DPI?

【问题讨论】:

  • this
  • 另外,你在说什么操作系统?
  • 我在 OS/X 上进行开发,但更喜欢一个可以在尽可能接近任何地方的解决方案。如果我必须列出优先级,OS/X、Linux,然后是其他。

标签: java screen multiple-monitors screens


【解决方案1】:

可以通过以下代码确定所有屏幕的 DPI: (JavaFX 必须初始化!)

public List<Integer> getScreenResolutions() {
    List<Integer> resolutions = new ArrayList<>();
    final List<?> screens = com.sun.javafx.tk.Toolkit.getToolkit().getScreens();
    for(Object screen : screens) {
        if (screen instanceof com.sun.glass.ui.Screen) {
            resolutions.add(((com.sun.glass.ui.Screen) screen).getResolutionX());
        }
    }
    return resolutions;
}

【讨论】:

    【解决方案2】:

    这有几个问题。让我们从理论上的角度开始。

    DPI(实际上是PPI)是单独计算宽度和高度的:

    DPIx = 屏幕宽度/分辨率x
    DPIy = 屏幕高度/ 分辨率y

    如果 DPIx=DPIy(当您的屏幕纵横比与分辨率相同时会发生这种情况)那么您有单个 DPI 值,但这不是强制的。因此,您必须小心使用单个 DPI 值。

    这将我们引向第二个问题 - 物理屏幕尺寸通常无法访问,甚至不总是已知的。请参阅 this questionthis question 以使用 Java。

    有 2 个工具包实现可以实现 getScreenResolution():Unix 系统使用 XToolkit(基于 X11 窗口系统),Windows 系统使用 WToolkit

    1. 两者都只计算DPIx,也就是你得到的数字。
    2. 两者都使用native 方法尝试从操作系统获取信息,但是该信息不可靠。见this question。您通常会返回一个默认值,这似乎是 96。
    3. WToolkit的javadoc在获取DPIx时明确指定:

      返回沿屏幕宽度每逻辑英寸的像素数。在具有多个显示监视器的系统中,该值对于所有监视器都是相同的。

      于是有了多显示器计划。 XToolkit 甚至没有 javadoc 那个方法。

    总之,我不会在任何显示器或操作系统上信任getScreenResolution()。您可以安全获得的是分辨率(甚至是所有可能的分辨率、刷新率、颜色深度......),并要求用户输入相关的物理尺寸数据。请记住,您可以拥有可以更改其“屏幕尺寸”的投影仪。否则,您将需要直接与驱动程序交互,希望它具有有效信息,但不能保证。

    编辑: 要获取设备的像素分辨率,请使用:

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gds = ge.getScreenDevices();
    for (GraphicsDevice gd : gds) {
        DisplayMode dm = gd.getDisplayMode();
        int h = dm.getHeight();
        int w = dm.getWidth();
        System.out.println(w + "x" + h);
        // or
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        Rectangle rec = gc.getBounds();
        System.out.println(rec.width + "x" + rec.height);
    }
    

    【讨论】:

    • 但是,defaultToolkit 有一个 getScreenResolution。无论我将哪台显示器插入主 HDMI,我都会得到它的实际分辨率(我知道,x 和 y 不一样,所以实际不准确)分辨率。所以肯定有其他监视器的非默认工具包,或者其他对象的 getResolution?
    • @JoeBryant Toolkit 不是每个显示器(实际上是图形设备)的对象,它与窗口系统相关联。当然,all 工具包有一个getScreenResolution(),因为它们继承了awt,Toolkit 的方法。并非所有人都实现了它,即使他们什么都不做也能保证正确的结果。我添加了以像素为单位获取显示器分辨率的常规方法。 DPI 的结果对程序来说是微不足道的,因为它们不关心物理尺寸。你需要它做什么?
    • 再次,像素/英寸
    • @JoeBryant 同样,您没有回答问题。我说你可以得到以像素为单位的分辨率。像素/英寸不是软件分辨率的度量。您需要一个与屏幕物理尺寸相关且不准确的结果?
    【解决方案3】:

    在调试了一段时间后,我找到了答案。图形设备上的 X 和 Y 分辨率(xResolution,yResolution)字段可以满足我的需求)。

    【讨论】:

    • GraphicsDevice 没有这些字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多