如何让JavaFX告诉我';在4k或1080p屏幕上显示m

如何让JavaFX告诉我';在4k或1080p屏幕上显示m,javafx,screen,screen-resolution,Javafx,Screen,Screen Resolution,我试图让JavaFX检测我使用的屏幕分辨率,1080p或4k,这样我就可以相应地调整程序的大小/位置 我尝试了Screen.getPrimary().getDpi(),结果显示为“96”。使用Toolkit.getDefaultToolkit().getScreenResolution()我得到了“144”的结果。我不知道哪一个是正确的,也不知道是否有更好的方法 请帮忙。谢谢。您实际上想知道屏幕的大小,而不是像素的密度。DPI是一种测量方法 在JavaFX中,您可以使用。正如名为的用户指出的,视

我试图让JavaFX检测我使用的屏幕分辨率,1080p或4k,这样我就可以相应地调整程序的大小/位置

我尝试了
Screen.getPrimary().getDpi()
,结果显示为“96”。使用
Toolkit.getDefaultToolkit().getScreenResolution()
我得到了“144”的结果。我不知道哪一个是正确的,也不知道是否有更好的方法


请帮忙。谢谢。

您实际上想知道屏幕的大小,而不是像素的密度。DPI是一种测量方法

在JavaFX中,您可以使用。正如名为的用户指出的,视觉边界仅返回所选屏幕的视觉区域的值。这意味着您要使用
screenObject.getVisualBounds()
来实现这一点,而
screenObject.getBounds()
来实现实际的屏幕大小

 // full bounds
 Rectangle2D bounds = Screen.getPrimary().getBounds();

 bounds.getWidth(); // screens width
 bounds.getHeight(); // screens height

 // visual bounds
 Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();

 visualBounds.getWidth(); // screens usable width (no task bars etc.)
 visualBounds.getHeight(); // screens usable height

在代码段中使用屏幕。您还可以通过使用获得其他屏幕。

我刚刚找到了另一种使用AWT GraphicsEnvironment查找屏幕宽度的方法。代码如下:

     GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getWidth()
这个方法给了我“真实”的4k屏幕宽度:3840

在Javafx中使用以下方法,宽度为2560

Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();

对于遇到类似问题的人来说,思考可能是一个有用的信息

需要注意的几件事:不会包含“本机窗口系统中的对象,如任务栏和菜单栏”,而且
visualBounds
“将报告与此相关”,因此Windows上的4K屏幕分辨率可能报告为(3840x2160/输出比例因子2)-任务栏区域(因此可能类似于1920 x 1000)(我从文档中猜测,我还没有试过)。我只是在2014年15号上试过“带视网膜显示的MacBook Pro,视觉边界为1440x805,而本机显示分辨率为2880x1800。@jewelsea我肯定会将此添加到回答中以澄清。这当然是需要的行为,因为可用面积是您想要说明的,OP要求“相应地调整大小/位置”。大多数情况下,您不需要“让JavaFX检测我使用的屏幕分辨率(1080p或4k),这样我就可以相应地调整/定位我的程序”.JavaFX在计算大小时将考虑默认的设备输出缩放。也就是说,JavaFX坐标系基于输出缩放像素,而不是显示器的物理像素。这样,无论使用4K还是1080p显示器,应用程序都将显示良好的缩放。如果应用程序窗口被拆分,它甚至可以正常显示两个不同显示器之间的距离。我猜您会从JavaFX中得到96作为dpi报告,从AWT工具包中得到144作为屏幕分辨率报告,因为AWT工具包没有考虑到操作系统应用的150%的分辨率,这是为了将输出缩放到您正在测量的给定显示器上。也就是说,AWT报告的是物理像素DPI和JavaFX正在报告按比例输出的DPI。