【问题标题】:How to make JavaFX tell if I'm on a 4k or 1080p screen如何让 JavaFX 判断我是在 4k 还是 1080p 屏幕上
【发布时间】:2018-02-21 20:51:35
【问题描述】:

我正在尝试让 JavaFX 检测我正在使用的屏幕分辨率,1080p 或 4k,因此我可以相应地调整程序的大小/位置。

我试过Screen.getPrimary().getDpi(),它打印出“96”。使用Toolkit.getDefaultToolkit().getScreenResolution() 我得到了“144”的结果。我不知道哪个是正确的,或者是否有更好的方法。

请帮忙。谢谢。

【问题讨论】:

  • 大多数时候,您不需要“让 JavaFX 检测我使用的屏幕分辨率,1080p 或 4k,因此我可以相应地调整/定位我的程序”。 JavaFX 在计算大小时会考虑默认设备输出缩放。也就是说,JavaFX 坐标系统基于输出缩放像素,而不是显示器的物理像素。这样,无论使用 4K 还是 1080p 显示器,应用程序都将显示良好的缩放比例。如果应用程序窗口在两个不同的显示器之间分开,甚至可以。
  • 我的猜测是你得到 96 作为 JavaFX 的 dpi 和 144 作为 AWT 工具包的屏幕分辨率,因为 AWT 工具包没有考虑到 150% 的 output scale display setting由您的操作系统应用以将输出缩放到您正在测量的给定显示器上。也就是说,AWT 报告物理像素 DPI,JavaFX 报告输出缩放 DPI。

标签: javafx screen screen-resolution


【解决方案1】:

您实际上想知道屏幕尺寸,而不是像素密度。 DPI 是Dots Per Inch 的度量。

在 JavaFX 中,您可以使用 Screen class 实现此目的。正如名为 jewelsea 的用户指出的那样,visual bounds 仅返回所选屏幕的 visual 区域的值。这意味着您要为此使用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

在代码 sn-p 中,使用了 primary 屏幕。也可以通过Screen.getScreens()获取其他画面。

【讨论】:

  • 需要注意的几点:visualBounds 不会包含“本机窗口系统中的对象,例如任务栏和菜单栏”,visualBounds 也将与此 @ 相关联987654326@",因此 Windows 上的 4K 屏幕分辨率可能会报告为(3,840x2,160 / 输出比例因子为 2)-任务栏区域(因此可能类似于 1920 x 1000)(我从文档中猜测,我没有没试过)。
  • 我刚刚在配备 Retina 显示屏的 2014 年 15 英寸 MacBook Pro 上尝试过,视觉范围为 1440x805,而原始显示分辨率为 2880x1800。
  • @jewelsea 我一定会将此添加到答案中以澄清。这当然是想要的行为,因为可用区域是您要考虑的,并且 OP 要求 “相应地调整大小/位置”。
【解决方案2】:

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

     GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getWidth()

这个方法给了我“真正的”4k 屏幕宽度:3840

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多