Windows 10下JOptionPane用Windows L&F却显示Win7图标问题
解决JOptionPane在Windows 10显示Win7样式图标的问题
问题原因
Java自带的Windows系统外观(WindowsLookAndFeel)并未调用Windows 10的原生对话框API,而是使用了内置的Win7风格图标资源,因此即使在Win10环境下运行,JOptionPane仍会显示旧版图标。
解决方案
要获取Windows 10原生样式的对话框及图标,需绕开Swing的JOptionPane,直接调用Windows系统的原生对话框API。最可靠的方式是使用JNA(Java Native Access)库调用系统的MessageBox函数。
步骤1:引入JNA依赖
如果使用Maven,在pom.xml中添加以下依赖:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency>
步骤2:编写调用原生对话框的代码
import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinUser; public class NativeWinDialog { public static void main(String[] args) { // 调用Windows原生MessageBox,显示信息类对话框(Win10原生图标) User32.INSTANCE.MessageBoxW( null, // 父窗口句柄,null表示无父窗口 "Test", // 对话框内容 "Test", // 对话框标题 WinUser.MB_OK | WinUser.MB_ICONINFORMATION // 按钮类型+图标类型 ); } }
图标类型可选值
可以根据需求替换图标类型参数:
WinUser.MB_ICONINFORMATION:信息图标(蓝色圆圈i)WinUser.MB_ICONERROR:错误图标(红色叉号)WinUser.MB_ICONWARNING:警告图标(黄色感叹号)WinUser.MB_ICONQUESTION:问号图标(蓝色问号)
备选方案(自定义图标)
如果坚持使用Swing的JOptionPane,只能手动替换为自定义的Win10风格图标,但这种方式无法跟随系统主题变化,并非原生效果:
import javax.swing.*; public class JOPtest { public static void main(String[] Args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } // 替换为自定义的Win10风格图标(需自行准备图标文件) ImageIcon customIcon = new ImageIcon("your-icon-path.png"); JOptionPane.showMessageDialog( null, "Test", "Test", JOptionPane.OK_OPTION, customIcon ); } }
内容的提问来源于stack exchange,提问作者Miguel Soto
相关产品推荐
相关产品推荐

