Java jlabelhtml中的相对路径

Java jlabelhtml中的相对路径,java,html,relative-path,jlabel,Java,Html,Relative Path,Jlabel,我试图让JLabel显示一个html,它使用相对路径引用图像。 但我无法让JLabel找到图像。当我使用绝对路径时,它工作得很好 我曾尝试从命令行或eclipse和add对话框运行该程序,以显示当前工作目录的位置,但这是有用的。 因此,我得出的结论是,图像没有在当前目录中搜索-这使我说到点子上。图像在哪里寻找 下面是一个测试代码,显示了我正在做的事情: import javax.swing.*; public class HTMLLabel extends JFrame { publi

我试图让JLabel显示一个html,它使用相对路径引用图像。 但我无法让JLabel找到图像。当我使用绝对路径时,它工作得很好

我曾尝试从命令行或eclipse和add对话框运行该程序,以显示当前工作目录的位置,但这是有用的。 因此,我得出的结论是,图像没有在当前目录中搜索-这使我说到点子上。图像在哪里寻找

下面是一个测试代码,显示了我正在做的事情:

import javax.swing.*;

public class HTMLLabel extends JFrame {
    public HTMLLabel() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JOptionPane.showMessageDialog( this, 
                System.getProperty("user.dir"));

         String html = "<html>\n" +
        "   <body>\n" +
        "       <div style=\"text-align: center;\">\n" + 
        "           <img src=\"file://s.png\">\n"+
        "       </div>\n"+
        "   </body>\n"+
        "</html>";

         JLabel label = new JLabel(html);
         add(label);

         pack();
         setVisible(true);
    } 

    public static void main(String[] args) {
         new HTMLLabel();
    }
}
import javax.swing.*;
公共类HTMLLabel扩展了JFrame{
公共HTMLLabel(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JOptionPane.showMessageDialog(此,
System.getProperty(“user.dir”);
字符串html=“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
"";
JLabel标签=新的JLabel(html);
添加(标签);
包装();
setVisible(真);
} 
公共静态void main(字符串[]args){
新的HTMLLabel();
}
}

你为什么要这样做?只需使用这个
JLabel(图标图像)
constructor

JLabel label = new JLabel(createImageIcon("s.png","description"));

protected ImageIcon createImageIcon(String path, String description) {
  java.net.URL imgURL = getClass().getResource(path);
  if (imgURL != null) {
    return new ImageIcon(imgURL, description);
  } else {
    System.err.println("Couldn't find file: " + path);
    return null;
  }
}

或者如果您坚持使用html变体

顺便说一句,文件协议使用3个斜杠(
file://s.png
无效)和
file:///s.png
的意思是
C:\s.png
。如果映像位于您可以使用的起始目录中

String path = System.getProperty("user.dir");
String html =
  "<html>\n" +
     "<body>\n" +
        "<div style=\"text-align: center;\">\n" +
          "<img src=\"file:///"+path+"/s.png\">\n"+
        "</div>\n"+
     "</body>\n"+
  "</html>";
stringpath=System.getProperty(“user.dir”);
字符串html=
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
"";
但我不保证第二种解决方案。

我看到两种变体:

我不知道为什么,但对我来说这很有效

"                       <img src=\"file:s.png\">\n"+
“\n”+
假设s.png在当前工作目录中

另一个似乎更适合我的变体是:

URL url = HTMLLabel.class.getResource( "/s.png" );
  String html = "<html>\n" +
    "       <body>\n" +
    "               <div style=\"text-align: center;\">\n" + 
    "                       <img src=\""+url+"\">\n"+
    "               </div>\n"+
    "       </body>\n"+
    "</html>";
URL=htmlabel.class.getResource(“/s.png”);
字符串html=“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
"";

使用此函数为JLabel准备html文本,以显示与类的包相关的图像

public static String prepareHtmlToJLabelText(Class relativeClass, String html) {
    Pattern p = Pattern.compile("src=['\"](.*?)['\"]");
    Matcher m = p.matcher(html);
    while (m.find()) {
        html = html.replace(m.group(), "src='" + relativeClass.getResource(m.group(1)) + "'");
    }
    return html;
}
该函数替换“src”属性的内容,使其相对于提供程序类

例如:

jLabel.setText(prepareHtmlToJLabelText(this.getClass(), "<html><div style='text-align: center;'><img src='imageA.png'></div>Bla bla bla...<div style='text-align: center;'><img src='imageB.png'></div>"));
jLabel.setText(prepareHtmlToJLabelText(this.getClass(),“blablablabla…”);
无论如何,要获得真正的html支持,请使用JEditorPane。

我刚刚替换了您的

<img src=\"file://s.png\">\n"
//with
<img src=\"file:///s.png\">\n"+
\n“
//与
\n“+
这就解决了问题


注意:我将s.png文件放在src/java文件夹中

有趣的是,我猜java会自动更正不完整的scheme+文件路径:///但在file://s.pngIt这真的很奇怪,因为java还修正了路径分隔符(例如/gif//s.png和/gif///s.png到/gif/s.png)contexte的加倍,它确实可以使用\n“+这很奇怪,但不幸的是我需要它在工作目录下的特定文件夹中,并且\n“+不起作用。关于您和jitter建议的第二个解决方案,这有点问题,因为html不是硬编码在程序中的,而该程序实际上将html放在JLabel中—它是由另一个程序创建的,并放在工作目录的子目录中。这需要我解析html,并用绝对路径替换image src属性,这是我必须避免的。你认为这可能是一个平台问题吗?我在运行ubuntu。看,我也在运行ubuntu。8.10准确地说。这对我有用:。当subdir位于current wirking directory.jitter下时,我之所以不直接设置标签图标,是因为这里涉及到两个不同的程序:一个选择html,另一个显示html。这就是为什么我不能(轻松地)使用您的任何解决方案。但是谢谢(:我发现在windows上确实可以使用类似的东西将路径设置为相对路径:但是在ubuntu上这不起作用,在ubuntu上它只在没有子目录的情况下起作用。