在 Swing/JavaFX 中使用不同的缩放系数控制多个显示器上的 UI 缩放

问题描述 投票:0回答:1

当使用具有不同缩放系数的多个监视器时,我在基于 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

但是,这似乎没有考虑到每个显示器的单独缩放因子。

环境:

  • JDK 17
  • Windows 10

任何关于如何在具有不同缩放系数的多个显示器上实现一致的 UI 缩放的见解或建议将不胜感激。

java swing javafx awt netbeans-platform
1个回答
0
投票

这是有关处理纯 JavaFX 应用程序而不是混合 Swing/JavaFX 应用程序的输出缩放的信息。


对于 JavaFX,有一个辅助 API

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,并且它始终是正确的,并且不需要担心窗口的一部分位于一台显示器上的情况,并且部分位于另一个部分上,不同部分之间的缩放比例可能不同。

© www.soinside.com 2019 - 2024. All rights reserved.