本文目录导读:

我来帮您了解如何在 JEditorPane 中使用 HTMLEditorKit 嵌入自定义组件或内容。
基本用法
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class JEditorPaneEmbedExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JEditorPane Embed Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
// 创建 JEditorPane 并设置为 HTML 模式
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setEditable(false);
// 设置 HTML 内容
String html = "<html><body>" +
"<h1>嵌入式组件示例</h1>" +
"<p>这是普通文本内容</p>" +
"<div id='button1'>此处将嵌入按钮</div>" +
"<p>更多文本...</p>" +
"</body></html>";
editorPane.setText(html);
// 获取 HTMLEditorKit 并嵌入组件
HTMLEditorKit kit = (HTMLEditorKit) editorPane.getEditorKit();
HTMLDocument doc = (HTMLDocument) editorPane.getDocument();
// 创建按钮组件
JButton button = new JButton("点击我");
button.addActionListener(e -> JOptionPane.showMessageDialog(frame, "按钮被点击了!"));
// 在指定位置嵌入组件
try {
// 方法1:通过 Element 定位
Element[] elements = doc.getRootElements();
// 查找特定元素并嵌入
HTMLDocument.Iterator it = doc.getIterator(HTML.Tag.DIV);
while (it.next()) {
if ("button1".equals(it.getAttributes().getAttribute(HTML.Attribute.ID))) {
// 在该元素位置嵌入组件
int pos = it.getStartOffset();
kit.insertHTML(doc, pos, "<button id='mybutton'>虚拟按钮</button>", 0, 0, null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 添加组件到 JEditorPane 的视图层
editorPane.add(button);
button.setBounds(50, 80, 100, 30); // 设置位置和大小
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane);
frame.setVisible(true);
}
}
更高级的嵌入式组件示例
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.*;
public class AdvancedEmbedExample {
public static void main(String[] args) {
JFrame frame = new JFrame("高级嵌入式组件示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
final JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setEditable(false);
// 创建自定义视图工厂
HTMLEditorKit kit = new HTMLEditorKit() {
@Override
public ViewFactory getViewFactory() {
return new HTMLFactory() {
@Override
public View create(Element elem) {
AttributeSet attrs = elem.getAttributes();
String elemName = elem.getName();
// 自定义处理特定标签
if (elemName.equals("custom")) {
String type = (String) attrs.getAttribute("type");
if ("slider".equals(type)) {
return new SliderView(elem);
} else if ("checkbox".equals(type)) {
return new CheckboxView(elem);
}
}
return super.create(elem);
}
};
}
};
editorPane.setEditorKit(kit);
// 设置内容
String html = "<html><body>" +
"<h2>自定义嵌入式组件</h2>" +
"<custom type='slider' name='volume'>音量控制</custom><br>" +
"<custom type='checkbox' name='option1'>选项1</custom><br>" +
"<custom type='checkbox' name='option2'>选项2</custom><br>" +
"<p>普通文本内容</p>" +
"</body></html>";
editorPane.setText(html);
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane);
frame.setVisible(true);
}
// 自定义滑块视图
static class SliderView extends View {
private JSlider slider;
private JLabel label;
public SliderView(Element elem) {
super(elem);
slider = new JSlider(0, 100, 50);
slider.setPreferredSize(new Dimension(200, 30));
String name = (String) elem.getAttributes().getAttribute("name");
label = new JLabel(name + ": ");
}
@Override
public void paint(Graphics g, Shape allocation) {
Graphics2D g2d = (Graphics2D) g;
// 绘制组件
slider.setBounds(allocation.getBounds());
slider.paint(g);
}
@Override
public float getPreferredSpan(int axis) {
if (axis == View.X_AXIS) {
return 250;
} else {
return 50;
}
}
@Override
public Shape modelToView(int pos, Shape a, Position.Bias b) {
return a;
}
@Override
public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
return getStartOffset();
}
}
// 自定义复选框视图
static class CheckboxView extends View {
private JCheckBox checkBox;
public CheckboxView(Element elem) {
super(elem);
String name = (String) elem.getAttributes().getAttribute("name");
checkBox = new JCheckBox(name);
checkBox.setPreferredSize(new Dimension(150, 25));
}
@Override
public void paint(Graphics g, Shape allocation) {
checkBox.setBounds(allocation.getBounds());
checkBox.paint(g);
}
@Override
public float getPreferredSpan(int axis) {
if (axis == View.X_AXIS) {
return 150;
} else {
return 25;
}
}
@Override
public Shape modelToView(int pos, Shape a, Position.Bias b) {
return a;
}
@Override
public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
return getStartOffset();
}
}
}
使用 ComponentView 嵌入标准组件
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class ComponentViewExample {
public static void main(String[] args) {
JFrame frame = new JFrame("ComponentView 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
// 使用 ComponentView 嵌入按钮
HTMLEditorKit kit = new HTMLEditorKit() {
@Override
public ViewFactory getViewFactory() {
return new HTMLFactory() {
@Override
public View create(Element elem) {
// 为特定标签返回 ComponentView
String tagName = elem.getName();
if ("embed-button".equals(tagName)) {
JButton button = new JButton("嵌入式按钮");
button.addActionListener(e ->
JOptionPane.showMessageDialog(frame, "按钮被点击了!"));
return new ComponentView(elem) {
@Override
public Component createComponent() {
return button;
}
};
}
return super.create(elem);
}
};
}
};
editorPane.setEditorKit(kit);
// 注册自定义标签
try {
HTML.Tag embedTag = new HTML.Tag("embed-button") {};
// 不进行实际注册,使用自定义视图工厂处理
} catch (Exception e) {
e.printStackTrace();
}
// 设置内容(需要保留标签,由视图工厂处理)
String html = "<html><body>" +
"<h2>ComponentView 嵌入</h2>" +
"<p>下面是一个嵌入式按钮:</p>" +
"<component id='btn1'>按钮将被替换</component>" +
"<p>还可以嵌入其他组件...</p>" +
"</body></html>";
editorPane.setText(html);
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane);
frame.setVisible(true);
}
}
- 创建 HTMLEditorKit:重写
getViewFactory()方法 - 自定义 ViewFactory:创建自定义视图处理类
- 视图处理:根据需要创建自定义 View 或使用 ComponentView
- 布局管理:在自定义视图中处理组件的位置和大小
- 事件处理:确保组件能正常响应用户交互
这种方法可以让您在 HTML 内容中嵌入各种 Swing 组件,实现更丰富的交互功能。