无法加载jtextpane html图像

mfuanj7w  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我想创建一个可滚动的jtextpane,里面有一些html文本。里面有一些图像元素。如果我用浏览器打开文件,图像会正确显示,一切都很好。
我的问题是,我不能只是简单地修改文本与一些java代码,因为它位于一个属性文件内,所以我有点被迫得到正确的位置路径。
有没有人知道一个技巧,仍然使用html文本与一个属性文件与工作图像?

text=<html>
  <head></head>
  <body>
     <h3>Seer:</h3>
     <img src="icons/roles/seer_icon.png" align="left" height="64"/>
  </body>
</html>
fkvaft9z

fkvaft9z1#

因为src="icons/roles/seer_icon.png"不是以http:或https:,则它是 * 相对URL。* 相对URL的真实位置取决于充当HTML文档的基本上下文的URL。
如果使用setPage从URL加载HTML内容,则基本URL就是该URL。但是如果从String加载(由于从属性文件获取内容,因此可能会这样做),则没有基本URL。这意味着src="icons/roles/seer_icon.png"没有意义-没有可用于解析它的基本URL。
但您可以自己指定基准:

HTMLDocument doc = (HTMLDocument) textPane.getStyledDocument();
doc.setBase(MyApplication.class.getResource("/"));

请注意,HTML可能不是显示内容的最佳方式,除非您需要给予使用者能够复制和贴上内容。您可以随时自行建立内容:

// Properties file contains:
// text=Seer:
// icon=/icons/roles/seer_icon.png

String headingText = properties.getProperty("text");
String iconPath = properties.getProperty("icon");

JLabel headingLabel = new JLabel(headingText);
Font font = headingLabel.getFont();
font = font.deriveFont(24f);
headingLabel.setFont(font);

headingLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 12, 0));

Icon icon = new ImageIcon(MyApplication.class.getResource(iconPath));
JLabel iconLabel = new JLabel(icon);

JPanel content = new JPanel(new BorderLayout());
content.add(headingLabel, BorderLayout.PAGE_START);
content.add(iconLabel, BorderLayout.CENTER);

相关问题