我来帮您分析 JEditorPane 与 HTMLEditorKit 的缩进操作相关功能。

JEditorPane 和 HTMLEditorKit 的缩进处理
JEditorPane 配合 HTMLEditorKit 支持 HTML 内容的显示和编辑,包括缩进功能,以下是关键实现方式:
HTML 缩进支持
import javax.swing.*;
import javax.swing.text.html.*;
import java.awt.*;
import java.io.*;
public class HTMLIndentExample {
public static void main(String[] args) {
JFrame frame = new JFrame("HTML Indent Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
JEditorPane editorPane = new JEditorPane();
editorPane.setEditorKit(new HTMLEditorKit());
editorPane.setContentType("text/html");
// 支持缩进的 HTML 内容
String htmlContent = "<html><body>" +
"<h1>缩进示例</h1>" +
"<div style='margin-left: 20px;'>" +
" <p>这是有缩进的段落</p>" +
" <ul>" +
" <li style='margin-left: 10px;'>列表项 1</li>" +
" <li style='margin-left: 20px;'>列表项 2</li>" +
" </ul>" +
"</div>" +
"</body></html>";
editorPane.setText(htmlContent);
editorPane.setEditable(true);
frame.add(new JScrollPane(editorPane));
frame.setVisible(true);
}
}
实现代码缩进操作
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.event.*;
public class IndentActionExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Indent Actions");
JEditorPane editor = new JEditorPane();
editor.setEditorKit(new HTMLEditorKit());
// 添加快捷键缩进操作
InputMap inputMap = editor.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap actionMap = editor.getActionMap();
// 自定义缩进动作
Action indentAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
insertIndent(editor);
}
};
// Ctrl+I 触发缩进
KeyStroke keyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_I, InputEvent.CTRL_DOWN_MASK);
inputMap.put(keyStroke, "indent");
actionMap.put("indent", indentAction);
frame.add(new JScrollPane(editor));
frame.setSize(600, 400);
frame.setVisible(true);
}
private static void insertIndent(JEditorPane editor) {
try {
Document doc = editor.getDocument();
int caretPos = editor.getCaretPosition();
// 插入缩进(4个空格)
doc.insertString(caretPos, " ", null);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
自定义 HTML 解析器缩进
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.util.*;
public class CustomIndentParser extends HTMLDocument.HTMLReader {
private int indentLevel = 0;
private StringBuilder output = new StringBuilder();
public CustomIndentParser(HTMLDocument doc) {
super(doc);
}
@Override
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// 输出缩进
output.append(getIndent());
output.append("<").append(t.toString());
// 添加属性
Enumeration<?> names = a.getAttributeNames();
while (names.hasMoreElements()) {
Object name = names.nextElement();
output.append(" ").append(name).append("='")
.append(a.getAttribute(name)).append("'");
}
output.append(">\n");
indentLevel++;
}
@Override
public void handleEndTag(HTML.Tag t, int pos) {
indentLevel--;
output.append(getIndent());
output.append("</").append(t.toString()).append(">\n");
}
@Override
public void handleText(char[] data) {
output.append(getIndent());
output.append(data).append("\n");
}
private String getIndent() {
StringBuilder indent = new StringBuilder();
for (int i = 0; i < indentLevel; i++) {
indent.append(" "); // 每级2个空格
}
return indent.toString();
}
public String getFormattedOutput() {
return output.toString();
}
}
使用 HTMLEditorKit 的缩进属性
import javax.swing.text.html.*;
import javax.swing.text.*;
public class HTMLStyleIndent {
public static void main(String[] args) {
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
// 设置默认缩进样式
StyleSheet styleSheet = doc.getStyleSheet();
// 为不同元素设置缩进
styleSheet.addRule("body { " +
"margin-left: 10px; " +
"padding-left: 10px; " +
"}");
styleSheet.addRule("div { " +
"margin-left: 20px; " +
"padding-left: 15px; " +
"}");
styleSheet.addRule("ul { " +
"margin-left: 30px; " +
"padding-left: 20px; " +
"}");
styleSheet.addRule("li { " +
"text-indent: -5px; " +
"margin-left: 40px; " +
"}");
// 应用样式
JEditorPane editor = new JEditorPane();
editor.setEditorKit(kit);
editor.setDocument(doc);
}
}
高级缩进控制
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.*;
public class AdvancedIndentControl {
public static void createIndentedEditor() {
JEditorPane editor = new JEditorPane();
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = new HTMLDocument();
editor.setEditorKit(kit);
editor.setDocument(doc);
// 设置视图属性
ViewFactory factory = kit.getViewFactory();
// 自定义缩进的 HTML 内容
String html = String.join("\n",
"<html>",
"<head>",
"<style>",
" .indent1 { margin-left: 20px; }",
" .indent2 { margin-left: 40px; }",
" .indent3 { margin-left: 60px; }",
" blockquote {",
" margin-left: 30px;",
" border-left: 3px solid #ccc;",
" padding-left: 15px;",
" }",
"</style>",
"</head>",
"<body>",
"<p>普通段落</p>",
"<p class='indent1'>缩进一级</p>",
"<p class='indent2'>缩进二级</p>",
"<blockquote>",
" <p>引用内容,自动缩进</p>",
" <p>继续引用内容</p>",
"</blockquote>",
"</body>",
"</html>"
);
editor.setText(html);
editor.setEditable(true);
JFrame frame = new JFrame();
frame.add(new JScrollPane(editor));
frame.setSize(600, 400);
frame.setVisible(true);
}
}
- CSS 样式控制:通过 CSS 的 margin-left、padding-left、text-indent 控制缩进
- HTML 元素:blockquote、ul/ol、dl 等标签提供自然缩进
- 自定义解析:可以扩展 HTML 解析器实现自定义缩进格式
- 缩进操作:通过 Action 实现缩进/取消缩进功能
- 样式表:利用 StyleSheet 统一管理缩进样式
这些技术可以灵活控制 JEditorPane 中的 HTML 内容缩进显示。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播