【发布时间】:2016-02-02 15:41:03
【问题描述】:
我有一个组件放置问题。首先,我将尝试提供(可能有用的)信息,然后告诉您主要问题:
我的系统:Windows 8.1 64 位,Java 1.8.0_60 32 位
我想做的是:在了解所有连接屏幕的屏幕分辨率后,我将在屏幕周围放置一些摆动组件。这意味着我需要知道屏幕的分辨率。
我正在使用多台显示器。
-
3840 x 2160(主显示器)
-
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 时;它们保持相同的大小。
我希望我清楚这个问题。
【问题讨论】:
-
在您的问题中添加操作系统、JVM 等版本可能很有趣。还有一个MVCE 可以玩。
-
Oracle 没有修改 Swing 以在 4K 显示器上工作。看起来您有责任创建 4K 外观和感觉,免费赠送 L&F,并永远支持它。
-
@TT。 Windows 8.1 64 位,Java 1.8.0_60 32 位。我不认为 MVCE 是必要的,因为如果您有 4K 屏幕,即使是带有简单 jFrame 的模板项目也会显示问题。
-
我有个主意。您能否为用于启动应用程序的 java(w).exe 设置“禁用 HDPI 屏幕上的显示缩放”?这是在 Windows 可执行文件的属性面板上完成的。设置显示在这里:cdn.makeuseof.com/wp-content/uploads/2014/06/…
-
@NullPointer:我认为这个问题可能与 Windows 8 引入的新“每显示 DPI”设置有关。