如何在使用多台显示器时获得屏幕分辨率(getScreenResolution)?
我知道我可以拨打Toolkit.getDefaultToolkit().getScreenResolution()
并获得默认屏幕的DPI,但我无法找到一种方式让我获得与我已连接的其他显示器相同的信息。任何人都可以告诉我如何获得其他显示器的Toolkit
,或设备上的呼叫以获得这些显示器的DPI?如何在使用多台显示器时获得屏幕分辨率(getScreenResolution)?
这有几个问题。我们从理论的角度出发。
的DPI(实际上PPI)为宽度和高度分别计算:
DPI X =屏幕宽度/分辨率 X
DPI Ŷ =屏幕高度/分辨率 y
如果DPI x = DPI y(发生在您的屏幕高宽比与分辨率相同时),那么您有一个DPI值,但这不是强制执行的。所以,你必须小心使用一个DPI值。
这将我们引向第二个问题 - 物理屏幕的大小通常无法访问,甚至并不总是已知的。请参阅this question和this question以在Java中执行此操作。
有2个工具包实现getScreenResolution()
:Unix系统使用XToolkit
(基于X11窗口系统),Windows系统使用WToolkit
。
- 两者只计算DPI X,这就是你所得到的数字。
- 两者均使用
native
方法尝试从操作系统获取信息,但该信息不可靠。见this question。你通常得到返回的默认值,这似乎是96 -
WToolkit
的javadoc的规定明确得到DPI X时:返回每个逻辑英寸的像素数在屏幕宽度。在具有多个显示器的系统中,这个值对于所有显示器都是一样的。
所以有多监视器计划。
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不是每个监视器(图形设备,实际)对象,它都与窗口系统绑定。当然,所有*工具包都有'getScreenResolution()',因为它们从'awt,Toolkit'继承了这个方法。并不是所有人都能实施它,即使他们无所作为也能保证获得正确的结果。我添加了以像素为单位获取显示器分辨率的常规方法。因为他们不关心物理尺寸,所以DPI的结果对于程序来说是微不足道的。你需要什么? – user1803551
再次,像素/英寸 –
请参阅[this](http://*.com/questions/15334392/java-toolkit-screen-resolution-descrepensies)。 – user1803551
另外,你在说什么操作系统? – user1803551
我正在OS/X上开发,但更喜欢能尽可能靠近任何地方工作的解决方案。如果我必须列出优先级,OS/X,Linux等。 –