Categories 技术交流

使用基于JDK的GUI软件时穿模或者画面撕裂解决方法

系统:Windows 11

显卡:NVIDIA RTX 3060

显示器:1080P 165Hz 高刷新率

JDK:Oracle JDK 24

涉及软件:ZAP、MiniLPA 等基于 Java Swing 的 GUI 软件

——————————————————————————————————————————————

问题:

鼠标滑动、点击、操作菜单时,界面出现:

  • 撕裂
  • 穿模
  • 区块残影
  • 重绘错误

输入框内文字、按钮本身正常,操作区域外无异常

——————————————————————————————————————————————

尝试:

重装JDK、软件

Windows 兼容模式

DPI缩放 100%

都无效

——————————————————————————————————————————————

参考:

https://github.com/JFormDesigner/FlatLaf/issues/887

https://github.com/kaikramer/keystore-explorer/issues/497

问题原因(核心)

Java Swing/AWT 渲染机制的 Direct3D(D3D)加速和高刷新率环境兼容性差

  • Java 2D 默认用 D3D 加速(尤其在 Windows 上)
  • 高刷新率(120Hz+)下,Direct3D 渲染存在“未同步”的问题
  • 导致界面局部区域重绘异常,尤其在 NVIDIA 新驱动 + 高刷新率下更明显
  • 这是 Java 社区已知的 Bug,官方和社区项目(如FlatLaf)都有类似反馈

——————————————————————————————————————————————

解决方案:

1.临时禁用Java 的 Direct3D 加速

  • 方式:添加 JVM 参数 -Dsun.java2d.d3d=false
  • 原理:强制 Java 使用软件渲染(GDI),跳过有问题的 D3D 管线
  • 效果:解决菜单、滑动、点击时的撕裂和穿模问题

2.【推荐】直接设置系统环境变量(对所有 Java 程序生效)

  1. 右键【此电脑】 → 【属性】 → 【高级系统设置】 → 【环境变量】
  2. 在【用户变量】区域:
    • 变量名:JDK_JAVA_OPTIONS
    • 变量值:-Dsun.java2d.d3d=false
  3. 保存退出,重启电脑重新打开命令行

✅ 【检测环境变量生效】

PowerShell 输入:

echo $env:JDK_JAVA_OPTIONS

显示:

-Dsun.java2d.d3d=false

✅ 表示生效

3️⃣ 【可选】附加方案(根据情况测试)

参数功能适用场景
-Dsun.java2d.d3d=false彻底关闭 Direct3D✅首推
-Dsun.java2d.opengl=true启用 OpenGL 渲染如果禁D3D后性能太低可测试
-Dsun.java2d.d3d.onscreen=false只关闭窗口级 D3D对 FlatLaf 等UI有效,平衡性能和稳定
Prev 电脑扫盲之如何辨别显卡型号并更新驱动
Next 城市天际线新手扫盲篇之水电入门与进阶

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注