本文目录导读:

我来帮您了解如何在 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 组件,实现更丰富的交互功能。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播