如何在Java Swing的JTextArea中正确设置孟加拉语SutonnyMJ字体
解决JTextArea显示孟加拉语SutonnyMJ字体被裁剪的问题
问题原因
SutonnyMJ这类孟加拉语字体的字形高度普遍大于普通拉丁字体,而JTextArea默认行高不足以容纳完整字形,导致下半部分被截断;JTextField作为单行控件,默认行高适配了字体完整高度,因此显示正常。
解决方案
1. 手动设置适配的行高
通过FontMetrics获取字体实际高度,将JTextArea的行高设置为字体高度的1.5-2倍(可根据显示效果调整):
banglaFont = new Font("SutonnyMJ", Font.PLAIN, 20); tfAddress = new JTextArea(); tfAddress.setLineWrap(true); tfAddress.setWrapStyleWord(true); tfAddress.setBorder(customBorder); tfAddress.setFont(banglaFont); // 获取字体度量并设置行高 FontMetrics metrics = tfAddress.getFontMetrics(banglaFont); tfAddress.setRowHeight(metrics.getHeight() * 2); JScrollPane scrollPane = new JScrollPane(tfAddress); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setBounds(1025, 300, 250, 100); add(scrollPane);
2. 增加内边距(可选)
若设置行高后仍有轻微裁剪,可添加内边距避免文字贴近控件边缘:
tfAddress.setMargin(new Insets(4, 4, 4, 4));
3. 验证字体加载(备选)
确保SutonnyMJ字体已正确加载到系统中,避免 fallback 字体导致异常:
// 检查字体是否存在 boolean fontExists = Arrays.stream(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()) .anyMatch(name -> name.equals("SutonnyMJ")); if (!fontExists) { // 处理字体未找到的情况,比如加载外部字体文件 }
内容的提问来源于stack exchange,提问作者Md. Sabbir Hossain Onik
相关产品推荐
相关产品推荐

