gpt4 book ai didi

java - 使用 4K 显示器在 Java 中错误放置 SWING 组件

转载 作者:行者123 更新时间:2023-11-30 08:41:17 28 4
gpt4 key购买 nike

我有组件放置问题。首先,我将尝试提供(可能有用的)信息,然后告诉您主要问题:

我的系统:Windows 8.1 64位,Java 1.8.0_60 32位

我想做的是:在了解所有连接屏幕的屏幕分辨率后,我在屏幕周围放置了一些 Swing 组件。这意味着我需要知道屏幕的分辨率。

我正在使用多个显示器。

  1. 3840 x 2160(主显示器)

  2. 1920 x 1080(二级)

我使用:

graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
devices = graphicsEnvironment.getScreenDevices();

对于主屏幕设备:

devices[i].getDefaultConfiguration().getBounds()

返回 [0, 0, 2560, 1440]。而不是正确的值 3840 x 2160。

有趣的是;

devices[i].getDisplayMode().getWidth() and getHeight() 

返回正确的 3840 和 2160 值。

注意:这种差异不会发生在屏幕的任何其他分辨率选择中。例如,如果我为主屏幕选择 1920 x 1080,“getDefaultConfiguration().getBounds()”和“getDisplayMode().getWidth()”都会返回正确的值。

现在,

您可以说我已经获得了正确的尺寸。那么,这是怎么回事?

问题是,当我尝试放置我的 SWING 组件时,它们被放置在错误的位置。例如,位于 [3750, 0, 10, 10] 的元素最终出现在第二个显示器内,而它本应位于第一个屏幕的右上角。

另一个例子:如您所知,固定大小的组件在高分辨率下会显得更小。由于它与屏幕相关的像素百分比变小,组件本身看起来也变小了。例如;当我将屏幕分辨率从 1920x1080 增加到 2560x1440 时,我的组件变小了。但是,当我将分辨率从 2560x1440 提高到 3840x2160 时;它们保持相同的大小。

我希望我清楚这个问题。

最佳答案

我知道一个 Windows 8+ 特定功能,可能以这种方式显示:per-display DPI setting .该功能应该使应用程序窗口在物理上保持相同的大小,即使将它们拖过具有不同密度的显示器也是如此。

这是通过将应用程序的窗口渲染到一个中间缓冲区来实现的,然后由 DWM 缩放考虑目标屏幕 DPI。

可以使用以下对话框禁用此功能:

Compatibility settings

它必须在包含可执行程序的文件上完成,它显示任何帧。在 Java 中,它有点复杂,因为它是一个托管应用程序。在 java(w).exe 上更改此设置应该会全局改变行为。

通常,这种标志调整是由软件安装程序完成的。可以使用薄包装器将 java jar 包装到 exe 中。对于这项任务,我最喜欢 launch4j。包装器 exe 和 jar 文件可以包装到安装程序脚本中,该脚本在安装时设置标志。

关于java - 使用 4K 显示器在 Java 中错误放置 SWING 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com