【问题标题】:False SWING Component Placement in Java with 4K Monitor带有 4K 监视器的 Java 中的 False SWING 组件放置
【发布时间】:2016-02-02 15:41:03
【问题描述】:

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

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

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

我正在使用多台显示器。

  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 时;它们保持相同的大小。

我希望我清楚这个问题。

【问题讨论】:

  • 在您的问题中添加操作系统、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”设置有关。

标签: java swing


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多