Pregunta

Estoy intentando hacer que JLabel muestre un html que hace referencia a una imagen utilizando una ruta relativa.Pero no puedo hacer que JLabel localice la imagen.Funciona bien cuando uso la ruta absoluta.

Intenté ejecutar el programa desde la línea de comandos o desde eclipse y agregué un cuadro de diálogo para mostrarme dónde está el directorio de trabajo actual, pero fue inútil.Por lo tanto, llegué a la conclusión de que la imagen no se busca en el directorio actual, lo que me lleva al grano.¿Dónde se busca la imagen?

Aquí hay un código de prueba que muestra lo que estoy haciendo:

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();
    }
}
¿Fue útil?

Solución

Utilice esta función para preparar el texto HTML para el JLabel para mostrar imágenes en relación con el paquete de una clase.

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;
}

La función de sustituir el contenido del atributo "src" para que sea relativa a la clase de proveedor.

Ejemplo:

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>"));

De todos modos para un uso JEditorPane apoyo real html.

Otros consejos

Veo dos variantes:

No sé por qué, pero para mí esta obra

"                       <img src=\"file:s.png\">\n"+

suponiendo que s.png está en el directorio de trabajo actual.

Otra variante que parece más apropiado para mí es:

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>";

¿Por qué están haciendo aun así? Sólo tiene que utilizar este constructor JLabel(Icon image)

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;
  }
}

O si usted insiste en la variante de HTML.

Por cierto, el protocolo de archivo utiliza 3 barras (file://s.png no es válida) y file:///s.png significaría C:\s.png. Si reside la imagen en el directorio inicial que podría utilizar.

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>";

Pero no hago ninguna garantía sobre la segunda solución.

acabo de reemplazar tu

<img src=\"file://s.png\">\n"
//with
<img src=\"file:///s.png\">\n"+

y eso resolvió el problema

NOTA:Coloqué el archivo s.png en la carpeta src/java

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top