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

标签 java swing

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

我的系统: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 - Java 中 4K 显示器的错误 SWING 组件放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157700/

相关文章:

用于 GUI 创建的 Java Swing 进度监视器 (EDT)

java - 如何在 JFrame 中显示两个 JTable

Java:如何在ActionListener之后不断更新使用atomicInteger倒计时的JLabel

java - 强制完全重绘 Jpanel Java2D

java - XMLBeans Maven 插件未拾取 XSD

java - 使用 Math.Floor 比显式整数转换有什么好处吗?

java - 通用生产者和消费者

java - 在 Java 上启动 ServerSocket 并使用用户界面 (Swing) 卡住

java - 两个输出流?

Java Swing/Graphics - repaint() 或 validate() 不起作用?