Java jlabelhtml中的相对路径
我试图让JLabel显示一个html,它使用相对路径引用图像。 但我无法让JLabel找到图像。当我使用绝对路径时,它工作得很好 我曾尝试从命令行或eclipse和add对话框运行该程序,以显示当前工作目录的位置,但这是有用的。 因此,我得出的结论是,图像没有在当前目录中搜索-这使我说到点子上。图像在哪里寻找 下面是一个测试代码,显示了我正在做的事情: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
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上它只在没有子目录的情况下起作用。