本文目录导读:

我来详细解释JTextPane和StyledDocument在Java Swing中的使用。
基本概念
JTextPane 是 Swing 中的一个文本组件,支持样式化文本(富文本),它使用 StyledDocument 或 DefaultStyledDocument 来管理文档内容。
核心类关系
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();
注意事项
- 线程安全:Swing组件操作应在事件调度线程中进行
- 性能考虑:大量样式操作时考虑批量处理
- 样式继承:创建样式时可以指定父样式
- 位置计算:使用
doc.getLength()获取文档长度 - 异常处理:文档操作可能抛出
BadLocationException
这个样式系统适合构建文本编辑器、代码编辑器、富文本显示等应用场景。