JavaFX如何忽略Windows系统缩放以保持应用原始尺寸正常显示
JavaFX Windows系统缩放适配解决方案
1. 修正启动参数配置逻辑
你之前配置的两个参数未生效,大概率是设置时机不对,必须在调用Application.launch()之前完成参数设置,且不能在JavaFX初始化后修改。
- 代码中配置示例:
public class Main { public static void main(String[] args) { // 必须放在launch调用最前面 System.setProperty("prism.allowhidpi", "false"); System.setProperty("glass.win.uiScale", "1"); Application.launch(App.class, args); } }
- 更稳妥的方式是直接添加为JVM启动参数,运行时加入:
java -Dprism.allowhidpi=false -Dglass.win.uiScale=1 -jar yourApp.jar
2. 全局反向缩放适配(兼容性最强)
如果参数配置始终不生效,可以主动获取系统缩放因子,对应用根节点做反向缩放,完全抵消系统缩放影响:
@Override public void start(Stage primaryStage) { // 获取主屏幕缩放比例 double scaleFactor = Screen.getPrimary().getOutputScaleX(); Parent root = FXMLLoader.load(getClass().getResource("main.fxml")); // 根节点反向缩放,抵消系统放大效果 root.setScaleX(1 / scaleFactor); root.setScaleY(1 / scaleFactor); // 调整窗口尺寸,避免超出屏幕 double originalWidth = 800; // 替换为你的应用原始宽度 double originalHeight = 600; // 替换为你的应用原始高度 primaryStage.setScene(new Scene(root, originalWidth / scaleFactor, originalHeight / scaleFactor)); primaryStage.show(); }
这个方案不受JavaFX版本限制,对125%、150%等所有缩放比例都生效。
3. 打包后适配方案
如果应用打包成exe安装包,可通过修改程序manifest文件禁用DPI感知:
在manifest的asmv3:application节点下添加配置:
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>false</dpiAware> </asmv3:windowsSettings>
配置后系统会直接对应用做位图拉伸,不会单独放大文字导致排版错乱。
注意事项
- 尽量不要给Label、Button等组件写死固定宽高,优先使用
prefWidth、prefHeight配合自适应布局(VBox、HBox、GridPane等),预留文字显示冗余空间 - 不要混用缩放参数和反向缩放方案,避免出现二次缩放导致尺寸异常
内容的提问来源于stack exchange,提问作者NoaJunod
相关产品推荐
相关产品推荐

