我来为您详细介绍如何使用JTextPane进行样式文本编辑。

JTextPane 样式文本编辑指南
基本设置
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
public class StyleTextEditor {
public static void main(String[] args) {
JFrame frame = new JFrame("样式文本编辑器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
// 创建JTextPane
JTextPane textPane = new JTextPane();
textPane.setFont(new Font("宋体", Font.PLAIN, 14));
// 添加到滚动面板
JScrollPane scrollPane = new JScrollPane(textPane);
frame.add(scrollPane);
frame.setVisible(true);
}
}
应用文本样式
public void applyStyles(JTextPane textPane) {
StyledDocument doc = textPane.getStyledDocument();
// 创建各种样式
Style defaultStyle = StyleContext.getDefaultStyleContext()
.getStyle(StyleContext.DEFAULT_STYLE);
// 粗体样式
Style bold = doc.addStyle("bold", defaultStyle);
StyleConstants.setBold(bold, true);
// 斜体样式
Style italic = doc.addStyle("italic", defaultStyle);
StyleConstants.setItalic(italic, true);
// 带颜色样式
Style redStyle = doc.addStyle("red", defaultStyle);
StyleConstants.setForeground(redStyle, Color.RED);
StyleConstants.setFontSize(redStyle, 16);
try {
// 插入不同样式的文本
doc.insertString(0, "这是普通文本\n", defaultStyle);
doc.insertString(doc.getLength(), "这是粗体文本\n", bold);
doc.insertString(doc.getLength(), "这是斜体文本\n", italic);
doc.insertString(doc.getLength(), "这是红色大号文本\n", redStyle);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
实时样式切换
class StyleEditorPanel extends JPanel {
private JTextPane textPane;
private StyledDocument doc;
public StyleEditorPanel() {
setLayout(new BorderLayout());
// 创建工具栏
JToolBar toolbar = createToolBar();
add(toolbar, BorderLayout.NORTH);
// 创建文本面板
textPane = new JTextPane();
doc = textPane.getStyledDocument();
add(new JScrollPane(textPane), BorderLayout.CENTER);
}
private JToolBar createToolBar() {
JToolBar toolbar = new JToolBar();
// 粗体按钮
JButton boldBtn = new JButton("B");
boldBtn.setFont(new Font("Arial", Font.BOLD, 14));
boldBtn.addActionListener(e -> applyBold());
toolbar.add(boldBtn);
// 斜体按钮
JButton italicBtn = new JButton("I");
italicBtn.setFont(new Font("Arial", Font.ITALIC, 14));
italicBtn.addActionListener(e -> applyItalic());
toolbar.add(italicBtn);
// 下划线按钮
JButton underlineBtn = new JButton("U");
underlineBtn.setFont(new Font("Arial", Font.PLAIN, 14));
underlineBtn.addActionListener(e -> applyUnderline());
toolbar.add(underlineBtn);
// 颜色选择器
JButton colorBtn = new JButton("颜色");
colorBtn.addActionListener(e -> chooseColor());
toolbar.add(colorBtn);
// 字体大小选择器
JComboBox<Integer> sizeCombo = new JComboBox<>(new Integer[]{10, 12, 14, 16, 18, 20, 24, 28, 32});
sizeCombo.addActionListener(e -> applyFontSize((Integer) sizeCombo.getSelectedItem()));
toolbar.add(new JLabel("字号:"));
toolbar.add(sizeCombo);
return toolbar;
}
private void applyBold() {
applyStyle(StyleConstants.Bold, !isStyleActive(StyleConstants.Bold));
}
private void applyItalic() {
applyStyle(StyleConstants.Italic, !isStyleActive(StyleConstants.Italic));
}
private void applyUnderline() {
applyStyle(StyleConstants.Underline, !isStyleActive(StyleConstants.Underline));
}
private void applyStyle(Object style, boolean value) {
int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();
if (start != end) {
// 对选中文本应用样式
if (style == StyleConstants.Bold) {
StyleConstants.setBold(textPane.getCharacterAttributes(), value);
} else if (style == StyleConstants.Italic) {
StyleConstants.setItalic(textPane.getCharacterAttributes(), value);
} else if (style == StyleConstants.Underline) {
StyleConstants.setUnderline(textPane.getCharacterAttributes(), value);
}
// 应用样式到选中文本
MutableAttributeSet attrs = textPane.getInputAttributes();
textPane.setCharacterAttributes(attrs, true);
}
}
private boolean isStyleActive(Object style) {
AttributeSet attrs = textPane.getCharacterAttributes();
if (style == StyleConstants.Bold) {
return StyleConstants.isBold(attrs);
} else if (style == StyleConstants.Italic) {
return StyleConstants.isItalic(attrs);
} else if (style == StyleConstants.Underline) {
return StyleConstants.isUnderline(attrs);
}
return false;
}
private void chooseColor() {
Color color = JColorChooser.showDialog(this, "选择颜色", Color.BLACK);
if (color != null) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setForeground(attrs, color);
textPane.setCharacterAttributes(attrs, true);
}
}
private void applyFontSize(int size) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setFontSize(attrs, size);
textPane.setCharacterAttributes(attrs, true);
}
}
段落样式控制
public void applyParagraphStyles(JTextPane textPane) {
StyledDocument doc = textPane.getStyledDocument();
// 创建段落样式
SimpleAttributeSet centerAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(centerAlign, StyleConstants.ALIGN_CENTER);
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
SimpleAttributeSet leftAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(leftAlign, StyleConstants.ALIGN_LEFT);
try {
// 插入不同对齐方式的段落
doc.insertString(0, "左对齐文本\n", null);
doc.setParagraphAttributes(0, 7, leftAlign, false);
doc.insertString(doc.getLength(), "居中对齐文本\n", null);
doc.setParagraphAttributes(doc.getLength() - 8, 8, centerAlign, false);
doc.insertString(doc.getLength(), "右对齐文本\n", null);
doc.setParagraphAttributes(doc.getLength() - 7, 7, rightAlign, false);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
样式工具类
public class StyleUtils {
// 设置选中文本的颜色
public static void setTextColor(JTextPane textPane, Color color) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setForeground(attrs, color);
textPane.setCharacterAttributes(attrs, true);
}
// 设置选中文本的背景色
public static void setTextBackgroundColor(JTextPane textPane, Color color) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setBackground(attrs, color);
textPane.setCharacterAttributes(attrs, true);
}
// 设置字体
public static void setFont(JTextPane textPane, String fontName) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrs, fontName);
textPane.setCharacterAttributes(attrs, true);
}
// 设置字体大小
public static void setFontSize(JTextPane textPane, int size) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setFontSize(attrs, size);
textPane.setCharacterAttributes(attrs, true);
}
// 添加超链接样式
public static void makeHyperlink(JTextPane textPane, String url) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setUnderline(attrs, true);
StyleConstants.setForeground(attrs, Color.BLUE);
attrs.addAttribute(AttributeSet.NameAttribute, url);
textPane.setCharacterAttributes(attrs, false);
}
}
完整示例 - 简易富文本编辑器
public class RichTextEditor extends JFrame {
private JTextPane textPane;
private boolean isBold = false;
private boolean isItalic = false;
private boolean isUnderline = false;
public RichTextEditor() {
setTitle("简易富文本编辑器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
initUI();
setVisible(true);
}
private void initUI() {
setLayout(new BorderLayout());
// 菜单栏
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("文件");
JMenuItem saveItem = new JMenuItem("保存");
JMenuItem exitItem = new JMenuItem("退出");
fileMenu.add(saveItem);
fileMenu.add(exitItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
// 工具栏
JToolBar toolbar = new JToolBar();
// 样式按钮
JToggleButton boldBtn = new JToggleButton("粗体");
boldBtn.addActionListener(e -> {
isBold = !isBold;
toggleBold();
});
toolbar.add(boldBtn);
JToggleButton italicBtn = new JToggleButton("斜体");
italicBtn.addActionListener(e -> {
isItalic = !isItalic;
toggleItalic();
});
toolbar.add(italicBtn);
JToggleButton underlineBtn = new JToggleButton("下划线");
underlineBtn.addActionListener(e -> {
isUnderline = !isUnderline;
toggleUnderline();
});
toolbar.add(underlineBtn);
toolbar.addSeparator();
// 字体选择
String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
JComboBox<String> fontCombo = new JComboBox<>(fonts);
fontCombo.addActionListener(e -> changeFont((String) fontCombo.getSelectedItem()));
toolbar.add(new JLabel("字体:"));
toolbar.add(fontCombo);
// 字号选择
Integer[] sizes = {8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 72};
JComboBox<Integer> sizeCombo = new JComboBox<>(sizes);
sizeCombo.setSelectedItem(12);
sizeCombo.addActionListener(e -> changeFontSize((Integer) sizeCombo.getSelectedItem()));
toolbar.add(new JLabel("字号:"));
toolbar.add(sizeCombo);
add(toolbar, BorderLayout.NORTH);
// 文本编辑区
textPane = new JTextPane();
add(new JScrollPane(textPane), BorderLayout.CENTER);
// 状态栏
JPanel statusBar = new JPanel(new FlowLayout(FlowLayout.LEFT));
JLabel statusLabel = new JLabel("就绪");
statusBar.add(statusLabel);
add(statusBar, BorderLayout.SOUTH);
}
private void toggleBold() {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setBold(attrs, isBold);
textPane.setCharacterAttributes(attrs, false);
}
private void toggleItalic() {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setItalic(attrs, isItalic);
textPane.setCharacterAttributes(attrs, false);
}
private void toggleUnderline() {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setUnderline(attrs, isUnderline);
textPane.setCharacterAttributes(attrs, false);
}
private void changeFont(String fontName) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrs, fontName);
textPane.setCharacterAttributes(attrs, false);
}
private void changeFontSize(int size) {
MutableAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setFontSize(attrs, size);
textPane.setCharacterAttributes(attrs, false);
}
}
-
样式应用方式:
- 通过
StyledDocument插入带样式的文本 - 通过
AttributeSet实时修改选中文本样式
- 通过
-
常用样式属性:
- 字体:
FontFamily,FontSize,Bold,Italic - 颜色:
Foreground,Background - 装饰:
Underline,StrikeThrough - 段落:
Alignment,LineSpacing,FirstLineIndent
- 字体:
-
注意事项:
- 使用
SimpleAttributeSet创建新样式 - 使用
StyleConstants设置样式属性 - 使用
setCharacterAttributes应用字符样式 - 使用
setParagraphAttributes应用段落样式
- 使用
JTextPane 提供了丰富的样式编辑功能,适合实现简单的富文本编辑器,对于更复杂的需求,可以考虑使用 JavaFX 或第三方库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播