Question

Je suis en train de faire un JLabel montrer html qui fait référence à une image en utilisant un chemin relatif. Mais je ne peux pas faire JLabel localiser l'image. Il fonctionne très bien quand je suis en utilisant un chemin absolu.

J'ai essayé d'exécuter le programme à partir de la ligne de commande ou d'Eclipse et ajouter boîte de dialogue pour me montrer où est le répertoire de travail en cours, mais pour résultat. Je celui-ci est venu à la conclusion que l'image ne soit pas recherchée dans le répertoire courant - ce qui me amène au point. où est l'image recherchée?

ici est un code de test qui montre ce que je fais:

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();
    }
}
Était-ce utile?

La solution

Utilisez cette fonction pour préparer le texte html pour le JLabel pour afficher les images par rapport à l'ensemble d'une classe.

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 fonction remplacer le contenu de l'attribut « src » pour le rendre par rapport à la classe de fournisseur.

Exemple:

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

Quoi qu'il en soit pour un soutien réel html utilisation JEditorPane.

Autres conseils

Je vois deux variantes:

Je ne sais pas pourquoi, mais pour moi cela fonctionne

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

en supposant que s.png est dans le répertoire de travail courant.

Une autre variante qui semble plus approprié pour moi est:

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

Pourquoi fais-tu encore comme ça? Il suffit d'utiliser ce constructeur de 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;
  }
}

Ou si vous insistez sur la variante html.

BTW Le protocole de fichier utilise des barres obliques 3 (file://s.png est invalide) et file:///s.png signifierait C:\s.png. Si l'image se trouve dans le répertoire de départ, vous pouvez utiliser.

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

Mais je ne fais aucune garantie quant à la 2ème solution.

i viens de remplacer votre

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

et résolu le problème

NOTE: i placé le fichier s.png dans le dossier src / java

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top