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