我知道我可以调用Toolkit.getDefaultToolkit().getScreenResolution()
并获取默认屏幕的 DPI,但我无法为我的生活找到一种方法来为我连接的其他显示器获取相同的信息。谁能告诉我如何Toolkit
为其他显示器获取一个,或在设备上调用以获取这些显示器的 DPI?
3 回答
所有屏幕的 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;
}
这有几个问题。让我们从理论点开始。
DPI(实际上是PPI)是针对宽度和高度分别计算的:
DPI x = 屏幕宽度/分辨率x
DPI y = 屏幕高度/分辨率y
如果DPI x =DPI y(当屏幕的纵横比与分辨率相同时会发生这种情况),那么您只有一个 DPI 值,但这不是强制的。因此,您必须小心使用单个 DPI 值。
这将我们引向第二个问题——物理屏幕尺寸通常无法访问,甚至不总是已知的。请参阅此问题和此问题以在 Java 中执行此操作。
有 2 个工具包实现可以实现getScreenResolution()
:Unix 系统使用XToolkit
(基于 X11 窗口系统)和 Windows 系统使用WToolkit
.
- 两者都只计算DPI x,这是你得到的数字。
- 两者都使用
native
方法尝试从操作系统获取信息,但是该信息不可靠。看到这个问题。您通常会返回一个默认值,这似乎是 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);
}
在调试了一段时间后,我找到了答案。图形设备上有用于 X 和 Y 分辨率(xResolution,yResolution)的字段,可以满足我的需求)。