You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Swing JTextPane中展示自定义格式的词典文本?

Java Swing 词典词条格式化展示实现方案

1. 词条文本预解析

首先需要开发自定义解析器,按约定规则将TXT内容拆解为结构化数据:

  • 定义数据实体类,可按层级分为词条主类(存词条名、音标)、词性类(存词性名称、对应释义列表)、释义类(存释义内容、对应例句列表)、例句类(存英文例句、越南语翻译)
  • 逐行读取TXT内容,按行首标记分类处理:
    • 行首为@:拆分词条名与音标
    • 行首为*:提取词性内容
    • 行首为-:提取释义文本
    • 行首为=:通过最后一个+符号拆分,前半部分为英文例句,后半部分为越南语翻译

2. JTextPane 富文本渲染

JTextPane通过StyledDocument实现富文本展示,具体实现步骤如下:

2.1 提前定义各层级样式

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;

// 初始化全局样式
StyleContext styleContext = StyleContext.getDefaultStyleContext();
// 词条样式:加粗、大号字体、蓝色
Style headwordStyle = styleContext.addStyle("headword", null);
StyleConstants.setBold(headwordStyle, true);
StyleConstants.setFontSize(headwordStyle, 18);
StyleConstants.setForeground(headwordStyle, new Color(25, 108, 185));

// 音标样式:斜体、灰色
Style phoneticStyle = styleContext.addStyle("phonetic", null);
StyleConstants.setItalic(phoneticStyle, true);
StyleConstants.setFontSize(phoneticStyle, 14);
StyleConstants.setForeground(phoneticStyle, Color.GRAY);

// 词性样式:加粗、墨绿色
Style posStyle = styleContext.addStyle("pos", null);
StyleConstants.setBold(posStyle, true);
StyleConstants.setFontSize(posStyle, 15);
StyleConstants.setForeground(posStyle, new Color(20, 120, 20));

// 释义样式:普通字体、左缩进20px
Style definitionStyle = styleContext.addStyle("definition", null);
StyleConstants.setFontSize(definitionStyle, 14);
StyleConstants.setLeftIndent(definitionStyle, 20);

// 英文例句样式:斜体、左缩进40px、深灰色
Style enSentenceStyle = styleContext.addStyle("enSentence", null);
StyleConstants.setItalic(enSentenceStyle, true);
StyleConstants.setFontSize(enSentenceStyle, 13);
StyleConstants.setLeftIndent(enSentenceStyle, 40);
StyleConstants.setForeground(enSentenceStyle, new Color(70,70,70));

// 越南语翻译样式:普通字体、左缩进40px、红棕色
Style viSentenceStyle = styleContext.addStyle("viSentence", null);
StyleConstants.setFontSize(viSentenceStyle, 13);
StyleConstants.setLeftIndent(viSentenceStyle, 40);
StyleConstants.setForeground(viSentenceStyle, new Color(150, 50, 50));

2.2 插入结构化内容到文档

// 初始化文档对象
DefaultStyledDocument doc = new DefaultStyledDocument(styleContext);
// 按层级插入内容,示例为解析后的结构化数据插入逻辑
try {
    // 插入词条和音标
    doc.insertString(doc.getLength(), parsedEntry.getWord() + " ", headwordStyle);
    doc.insertString(doc.getLength(), parsedEntry.getPhonetic() + "\n\n", phoneticStyle);
    
    // 遍历所有词性
    for (PosItem pos : parsedEntry.getPosList()) {
        doc.insertString(doc.getLength(), pos.getName() + "\n", posStyle);
        // 遍历词性下的所有释义
        for (DefinitionItem def : pos.getDefinitionList()) {
            doc.insertString(doc.getLength(), "- " + def.getContent() + "\n", definitionStyle);
            // 遍历释义下的所有例句对
            for (SentencePair sent : def.getSentenceList()) {
                doc.insertString(doc.getLength(), sent.getEn() + "\n", enSentenceStyle);
                doc.insertString(doc.getLength(), sent.getVi() + "\n\n", viSentenceStyle);
            }
        }
    }
} catch (BadLocationException e) {
    e.printStackTrace();
}

// 将渲染完成的文档绑定到JTextPane
jTextPane.setDocument(doc);
jTextPane.setEditable(false); // 词典展示场景禁止编辑
// 如需滚动效果,将JTextPane放入JScrollPane即可

注意事项

  • 解析例句行时,建议用lastIndexOf("+")找分割点,避免例句内容本身包含+导致拆分错误
  • 如果需要支持交互(如点击单词取词、跳转),可在插入内容时给AttributeSet附加自定义属性,配合鼠标监听器实现对应逻辑

内容的提问来源于stack exchange,提问作者thu.vix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:18:01