Java jar包运行时JTable无法正常显示UTF-8字符如何解决?
解决方案
首先优先确认读取环节是否正常:
- 把解析后拿到的对应小语种字符串通过日志打印或者断点调试查看内容,确认读取阶段没有乱码。如果读取出来就已经乱码,先校验JSON文件本身是否为UTF-8无BOM编码,部分编辑器保存时会默认加BOM头,会导致解析时首字符异常。
如果读取内容确认正常,显示方块的核心原因是Swing默认字体不包含对应语种的字符字形,可通过以下两种方案解决:
方案1:全局设置Swing多语言字体(适配全程序)
在程序启动入口main方法的最开头,窗口初始化之前,设置Swing组件全局默认字体,选择支持多语言的字体(比如思源黑体、Noto Sans、微软雅黑等)即可:
// 优先加载跨平台兼容的开源字体,可把字体文件打包到项目resources目录避免用户系统无对应字体 InputStream fontInput = YourMainClass.class.getResourceAsStream("/fonts/NotoSans-Regular.ttf"); Font globalFont = Font.createFont(Font.TRUETYPE_FONT, fontInput).deriveFont(14f); // 给JTable相关组件单独设置字体 UIManager.put("Table.font", globalFont); UIManager.put("Table.headerFont", globalFont); // 其他需要显示小语种的组件也可同步设置 UIManager.put("Label.font", globalFont); UIManager.put("Button.font", globalFont);
如果不需要跨分发兼容,也可以直接用系统自带字体:
Font globalFont = new Font("Microsoft YaHei", Font.PLAIN, 14); UIManager.put("Table.font", globalFont);
方案2:单独给目标JTable设置渲染器(不影响全局样式)
如果只需要当前JTable支持特殊字符显示,自定义单元格渲染器单独设置字体即可:
JTable dataTable = new JTable(tableModel); // 自定义单元格渲染器 dataTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { // 初始化支持小语种的字体 private final Font multiLangFont = new Font("Noto Sans", Font.PLAIN, 14); @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setFont(multiLangFont); return this; } });
内容的提问来源于stack exchange,提问作者el diablo
相关产品推荐
相关产品推荐

