JFontChooser选择本地字体显示方框、F12切换语言后字体异常问题
Java Swing记事本字体功能异常排查修复
异常表现
开发仿Windows自带记事本的Swing应用,新增自定义字体选择功能后稳定复现两类问题:
- 从
JFontChooser选择英文字体后初始显示正常,按下F12切换应用语言后字体显示错乱 - 选择本地字体时内容直接渲染为方框乱码,触发该问题后F12语言切换功能完全失效

原有问题代码
btnFont = new JMenuItem("Font"); btnFont.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { System.setProperty("file.encoding", "UTF-8"); JFontChooser fc = new JFontChooser(); JOptionPane.showMessageDialog(null,fc, "Chooser your font",JOptionPane.PLAIN_MESSAGE); inputArea.setFont(fc.getPreviewFont()); //inputArea.setText(inputArea.getText().getBytes(), "UTF-8"); } });
根因分析
- 运行时调用
System.setProperty("file.encoding", "UTF-8")属于无效操作:JVM启动阶段就会读取file.encoding参数完成全局字符集初始化,事件回调中修改该值不会改变已加载的字符集配置,反而会干扰Swing组件内部的字符编码解析逻辑,是触发本地字体显示方框、F12切换失效的核心原因。 - 字体获取方式错误:
fc.getPreviewFont()返回的是字体选择器预览面板使用的临时字体对象,部分版本JFontChooser的实现中,该对象未完整加载字体的字形映射表,加载本地第三方字体时极易出现字形丢失问题。 - 缺少字体兼容性校验:大量英文字体不包含CJK(中日韩)字符字形,切换到中文等非英文界面时,Swing找不到对应字符的字形就会渲染错乱;未做兼容回退逻辑时会直接触发组件渲染异常,导致后续快捷键事件无响应。
- 注释的文本重设逻辑存在编码风险:无参调用
String.getBytes()会使用系统默认编码做字节转换,极易破坏原有字符的编码结构,触发乱码。
修复方案
- 移除事件回调中设置
file.encoding的代码,如需全局指定UTF-8编码,在JVM启动时通过参数传入:
java -Dfile.encoding=UTF-8 -jar notepad-app.jar
- 修正字体获取逻辑,使用
getSelectedFont()获取用户最终确认的字体对象,同时增加字形兼容性校验,不兼容时自动回退到系统默认适配字体:
btnFont = new JMenuItem("字体"); btnFont.addActionListener(e -> { JFontChooser fc = new JFontChooser(); int option = JOptionPane.showConfirmDialog(null, fc, "选择字体", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if (option == JOptionPane.OK_OPTION) { Font selected = fc.getSelectedFont(); // 校验字体是否支持常用中英文、数字字形 if (selected.canDisplayUpTo("测试Test123") != -1) { // 不兼容时回退到系统默认无衬线字体,保证字形正常渲染 selected = new Font(Font.SANS_SERIF, selected.getStyle(), selected.getSize()); } inputArea.setFont(selected); } });
- 在F12语言切换的逻辑中新增字体兼容校验步骤:切换语言后重新校验当前已选字体是否支持新语言的字符集,不兼容则自动替换适配字体,最后调用
inputArea.revalidate()、inputArea.repaint()强制刷新组件渲染状态,避免显示错乱。
注意:如果本地字体加载仍有异常,可以提前通过
GraphicsEnvironment.registerFont()方法将本地字体注册到JVM字体环境,再提供给用户选择,避免Swing无法识别字体格式导致的渲染问题。
内容的提问来源于stack exchange,提问作者CSE
相关产品推荐
相关产品推荐

