我一直在使用JTextPane来显示基本的HTML内容,包括本地保存的图像。我一直在尝试使用文本窗格的输入属性设置JTextPane的样式。每当我修改窗格样式时,我都会破坏HTML图像,并且不会在没有注释掉样式代码的情况下显示。
这是代码的SSCE:
import java.awt.Color;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
public class JTextPaneImageTest {
public static void main(String[] args) {
new JTextPaneImageTest();
}
public JTextPaneImageTest() {
JTextPane textPane = new JTextPane();
textPane.setContentType("text/html");
textPane.setEditable(false);
String content = "<html><body><p>Test text here</p>"
+ "<img src=\"file:\\\\\\C:\\Users\\racha_000\\AppData\\Local\\Temp\\ebookr\\test.jpg\" />"
+ "</body></html>";
System.out.println(content);
HTMLEditorKit editorKit = (HTMLEditorKit) textPane.getEditorKit();
HTMLDocument htmlDoc = (HTMLDocument) textPane.getDocument();
MutableAttributeSet mats = textPane.getInputAttributes();
StyleConstants.setForeground(mats, Color.RED);
try {
editorKit.insertHTML(htmlDoc, htmlDoc.getLength(), content, 0, 0, null);
} catch (BadLocationException | IOException e) {
e.printStackTrace();
} finally {
htmlDoc.setCharacterAttributes(0, htmlDoc.getLength(), mats, true);
}
JFrame frame = new JFrame();
frame.add(textPane);
frame.setVisible(true);
}
}
需要注意的重要代码是,每当更改可变属性集并设置字符属性时,图像都不起作用。
MutableAttributeSet mats = textPane.getInputAttributes();
StyleConstants.setForeground(mats, Color.RED);
htmlDoc.setCharacterAttributes(0, htmlDoc.getLength(), mats, true);
没有样式:
使用样式:
以这种方式设置文档样式是唯一对我有用的方法,因为我将所有内容一次性插入HTML并以同样的方式设置样式。其他方法没有用,所以我希望能够维护这种样式化面板的方法。
答案 0 :(得分:1)
将setCharacterAttributes()
方法的最后一个参数( replace )调用到true
会稍微删除与您的图像相关的HTML代码。
只需使用false
调用它就可以了:
htmlDoc.setCharacterAttributes(0, htmlDoc.getLength(), mats, false);