JTextPaneStyledDocument样式文档

wen java案例 1

本文目录导读:

JTextPaneStyledDocument样式文档

  1. 基本概念
  2. 核心类关系
  3. 基础示例
  4. 高级样式应用
  5. 完整富文本编辑器示例
  6. 样式操作重要方法
  7. 注意事项

我来详细解释JTextPane和StyledDocument在Java Swing中的使用。

基本概念

JTextPane 是 Swing 中的一个文本组件,支持样式化文本(富文本),它使用 StyledDocumentDefaultStyledDocument 来管理文档内容。

核心类关系

JTextPane
  └── StyledDocument (接口)
        └── DefaultStyledDocument (实现类)
              └── 包含 Style 和 Element 对象

基础示例

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
public class StyleDemo extends JFrame {
    private JTextPane textPane;
    private StyledDocument doc;
    public StyleDemo() {
        // 创建文本窗格
        textPane = new JTextPane();
        doc = textPane.getStyledDocument();
        // 添加文本和样式
        addStyledText();
        // 设置滚动面板
        JScrollPane scrollPane = new JScrollPane(textPane);
        add(scrollPane);
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    private void addStyledText() {
        // 创建样式
        Style defaultStyle = textPane.getStyle(StyleContext.DEFAULT_STYLE);
        // 创建红色粗体样式
        Style redBold = textPane.addStyle("RedBold", defaultStyle);
        StyleConstants.setForeground(redBold, Color.RED);
        StyleConstants.setBold(redBold, true);
        // 创建蓝色斜体样式
        Style blueItalic = textPane.addStyle("BlueItalic", defaultStyle);
        StyleConstants.setForeground(blueItalic, Color.BLUE);
        StyleConstants.setItalic(blueItalic, true);
        // 创建标题样式
        Style heading = textPane.addStyle("Heading", defaultStyle);
        StyleConstants.setFontSize(heading, 24);
        StyleConstants.setBold(heading, true);
        // 插入样式化文本
        try {
            doc.insertString(0, "样式化文本示例\n", heading);
            doc.insertString(doc.getLength(), "这是红色粗体文本\n", redBold);
            doc.insertString(doc.getLength(), "这是蓝色斜体文本\n", blueItalic);
            doc.insertString(doc.getLength(), "这是普通文本\n", null);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new StyleDemo());
    }
}

高级样式应用

设置段落属性

import javax.swing.text.*;
import java.awt.*;
public class ParagraphStyleDemo {
    public static void setupParagraphStyles(JTextPane textPane) {
        StyledDocument doc = textPane.getStyledDocument();
        // 创建段落样式
        MutableAttributeSet paragraphAttrs = new SimpleAttributeSet();
        StyleConstants.setAlignment(paragraphAttrs, StyleConstants.ALIGN_CENTER);
        StyleConstants.setLeftIndent(paragraphAttrs, 20);
        StyleConstants.setRightIndent(paragraphAttrs, 20);
        StyleConstants.setSpaceAbove(paragraphAttrs, 10);
        StyleConstants.setSpaceBelow(paragraphAttrs, 10);
        // 应用段落样式
        doc.setParagraphAttributes(0, doc.getLength(), paragraphAttrs, false);
    }
    public static void setupBulletPoints(JTextPane textPane) {
        StyledDocument doc = textPane.getStyledDocument();
        // 创建带编号的列表
        MutableAttributeSet listAttrs = new SimpleAttributeSet();
        StyleConstants.setLeftIndent(listAttrs, 30);
        StyleConstants.setFirstLineIndent(listAttrs, -15); // 负值表示悬挂缩进
        // 设置段落间距
        StyleConstants.setSpaceAbove(listAttrs, 5);
        StyleConstants.setSpaceBelow(listAttrs, 5);
    }
}

文字效果

public class TextEffectsDemo {
    public static void addTextEffects(StyleContext sc, Style base) {
        // 下划线
        Style underline = sc.addStyle("underline", base);
        StyleConstants.setUnderline(underline, true);
        // 删除线
        Style strikethrough = sc.addStyle("strikethrough", base);
        StyleConstants.setStrikeThrough(strikethrough, true);
        // 上标
        Style superscript = sc.addStyle("superscript", base);
        StyleConstants.setSuperscript(superscript, true);
        // 下标
        Style subscript = sc.addStyle("subscript", base);
        StyleConstants.setSubscript(subscript, true);
        // 背景色
        Style highlight = sc.addStyle("highlight", base);
        StyleConstants.setBackground(highlight, Color.YELLOW);
        // 字体和大小
        Style customFont = sc.addStyle("customFont", base);
        StyleConstants.setFontFamily(customFont, "Serif");
        StyleConstants.setFontSize(customFont, 16);
    }
}

混合样式

public class MixedStyleDemo {
    public static void applyMixedStyles(JTextPane textPane) {
        StyledDocument doc = textPane.getStyledDocument();
        StyleContext sc = new StyleContext();
        // 创建组合样式
        Style mixedStyle = sc.addStyle("Mixed", null);
        StyleConstants.setForeground(mixedStyle, Color.BLUE);
        StyleConstants.setBold(mixedStyle, true);
        StyleConstants.setItalic(mixedStyle, true);
        StyleConstants.setFontSize(mixedStyle, 18);
        StyleConstants.setUnderline(mixedStyle, true);
        try {
            doc.insertString(0, "这种文本同时具有:", null);
            doc.insertString(doc.getLength(), "蓝色、粗体、斜体、下划线", mixedStyle);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
    }
}

完整富文本编辑器示例

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class RichTextEditor extends JFrame {
    private JTextPane textPane;
    private StyledDocument doc;
    private StyleContext sc;
    public RichTextEditor() {
        setTitle("简单富文本编辑器");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 初始化文本组件
        textPane = new JTextPane();
        doc = textPane.getStyledDocument();
        sc = new StyleContext();
        // 创建工具栏
        JToolBar toolbar = createToolbar();
        // 布局
        setLayout(new BorderLayout());
        add(toolbar, BorderLayout.NORTH);
        add(new JScrollPane(textPane), BorderLayout.CENTER);
        setVisible(true);
    }
    private JToolBar createToolbar() {
        JToolBar toolbar = new JToolBar();
        // 粗体按钮
        JButton boldBtn = new JButton("B");
        boldBtn.setFont(new Font("Arial", Font.BOLD, 14));
        boldBtn.addActionListener(e -> toggleBold());
        // 斜体按钮
        JButton italicBtn = new JButton("I");
        italicBtn.setFont(new Font("Arial", Font.ITALIC, 14));
        italicBtn.addActionListener(e -> toggleItalic());
        // 下划线按钮
        JButton underlineBtn = new JButton("U");
        underlineBtn.setFont(new Font("Arial", Font.PLAIN, 14));
        underlineBtn.addActionListener(e -> toggleUnderline());
        toolbar.add(boldBtn);
        toolbar.add(italicBtn);
        toolbar.add(underlineBtn);
        return toolbar;
    }
    private void toggleBold() {
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setBold(attrs, !StyleConstants.isBold(attrs));
        textPane.setCharacterAttributes(attrs, false);
    }
    private void toggleItalic() {
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setItalic(attrs, !StyleConstants.isItalic(attrs));
        textPane.setCharacterAttributes(attrs, false);
    }
    private void toggleUnderline() {
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setUnderline(attrs, !StyleConstants.isUnderline(attrs));
        textPane.setCharacterAttributes(attrs, false);
    }
}

样式操作重要方法

字符样式

// 设置字符属性
StyleConstants.setBold(attr, true);
StyleConstants.setItalic(attr, true);
StyleConstants.setUnderline(attr, true);
StyleConstants.setForeground(attr, Color.RED);
StyleConstants.setBackground(attr, Color.YELLOW);
StyleConstants.setFontSize(attr, 18);
StyleConstants.setFontFamily(attr, "Serif");

段落样式

// 设置段落属性
StyleConstants.setAlignment(attr, StyleConstants.ALIGN_CENTER);
StyleConstants.setLeftIndent(attr, 20);
StyleConstants.setRightIndent(attr, 20);
StyleConstants.setFirstLineIndent(attr, 30);
StyleConstants.setSpaceAbove(attr, 10);
StyleConstants.setSpaceBelow(attr, 10);

文档操作

// 插入带样式的文本
doc.insertString(offset, text, style);
// 设置字符属性
doc.setCharacterAttributes(offset, length, attrs, replace);
// 设置段落属性
doc.setParagraphAttributes(offset, length, attrs, replace);
// 获取当前属性
AttributeSet attrs = textPane.getCharacterAttributes();

注意事项

  1. 线程安全:Swing组件操作应在事件调度线程中进行
  2. 性能考虑:大量样式操作时考虑批量处理
  3. 样式继承:创建样式时可以指定父样式
  4. 位置计算:使用doc.getLength()获取文档长度
  5. 异常处理:文档操作可能抛出BadLocationException

这个样式系统适合构建文本编辑器、代码编辑器、富文本显示等应用场景。

抱歉,评论功能暂时关闭!