当使用具有不同缩放系数的多个监视器时,我在基于 NetBeans 平台 (Swing) 和 JavaFX 应用程序中遇到 UI 缩放问题。在一台显示器上,我的缩放比例为 125%,而在另一台显示器上,则设置为 150%。
我正在使用 -
J-Dsun.java2d.uiScale
Java 选项来缩放 UI。但是,此选项似乎无法适当缩放两个显示器。我想要实现一个场景,其中 uiScale
缩放因子乘以各个监视器缩放因子。例如,如果 uiScale
设置为 2,我希望缩放比例为 125% 的显示器上的 GUI 缩放为 1.25 * 2,缩放比例为 150% 的显示器上的 GUI 应缩放为 1.5 * 2.
有没有办法在Java中实现这种行为?是否需要考虑其他 Java 选项或配置,以使 UI 缩放在具有不同缩放因子的显示器之间保持一致?
当前的方法: 我目前正在使用以下 Java 选项进行 UI 缩放:
-J-Dsun.java2d.uiScale=2
但是,这似乎没有考虑到每个显示器的单独缩放因子。
环境:
任何关于如何在具有不同缩放系数的多个显示器上实现一致的 UI 缩放的见解或建议将不胜感激。
这是有关处理纯 JavaFX 应用程序而不是混合 Swing/JavaFX 应用程序的输出缩放的信息。
Screen::getOutputScaleY()
(对于 X 来说也是如此)。
获取该Screen在垂直(Y)方向的推荐输出比例因子。该比例因子将应用于场景,以补偿输出设备的分辨率和观看距离。将相对于该比例因子报告视觉边界。
也许该信息可能对您的 JavaFX 工作有所帮助。对于java2d的东西,我不知道。
当在 JavaFX 应用程序的
start()
方法中执行以下代码时。
System.out.println(Screen.getScreens());
在我的 PC 上运行(MacBook PRO,内部屏幕以 2 倍缩放,连接的宽屏外部显示器以 1 倍缩放),我得到以下输出:
[
javafx.stage.Screen@c829b7c6
bounds:Rectangle2D [minX=0.0, minY=0.0, maxX=1792.0, maxY=1120.0, width=1792.0, height=1120.0]
visualBounds:Rectangle2D [minX=0.0, minY=25.0, maxX=1792.0, maxY=1120.0, width=1792.0, height=1095.0]
dpi:132.0
outputScale:(2.0,2.0),
javafx.stage.Screen@d3ba4740
bounds:Rectangle2D [minX=-3440.0, minY=0.0, maxX=0.0, maxY=1440.0, width=3440.0, height=1440.0]
visualBounds:Rectangle2D [minX=-3440.0, minY=25.0, maxX=0.0, maxY=1361.0, width=3440.0, height=1336.0]
dpi:109.0
outputScale:(1.0,1.0)
]
内部监视器和主屏幕中列出的第一个屏幕。列出的第二个屏幕是外部宽屏显示器和位于主屏幕左侧的辅助屏幕(因此为屏幕的 minX 和 minY 值报告负坐标)。
在内部,JavaFX了解不同屏幕的不同输出比例,并根据outputScale调整渲染。因此,实际上,它“正常工作”,无需任何额外的设置或编码。
在 Mac 上,默认设置是将窗口对齐到屏幕,而不是跨屏幕共享它们。因此,窗口不能部分分割,并在一个屏幕或另一个屏幕上显示某些内容。这可以通过 OS 系统设置 覆盖(我没有尝试过)。但假设默认值,这对于应用程序来说很简单,因为整个屏幕将由 JavaFX 在内部缩放到 outputScale,并且它始终是正确的,并且不需要担心窗口的一部分位于一台显示器上的情况,并且部分位于另一个部分上,不同部分之间的缩放比例可能不同。