本文目录导读:

我来详细解释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
这个样式系统适合构建文本编辑器、代码编辑器、富文本显示等应用场景。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播