系统: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 程序生效)
- 右键【此电脑】 → 【属性】 → 【高级系统设置】 → 【环境变量】
- 在【用户变量】区域:
- 变量名:
JDK_JAVA_OPTIONS
- 变量值:
-Dsun.java2d.d3d=false
- 变量名:
- 保存退出,重启电脑或重新打开命令行
✅ 【检测环境变量生效】
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有效,平衡性能和稳定 |