Frage

Ich versuche, JLabel zeigen eine html zu machen, die ein Bild verweist auf einen relativen Pfad. Aber ich kann nicht machen JLabel das Bild zu lokalisieren. Es funktioniert gut, wenn ich absoluten Pfad verwenden.

Ich habe versucht, das Programm von der Kommandozeile oder aus Eclipse läuft und füge Dialog mir zu zeigen, wo das aktuelle Arbeitsverzeichnis ist aber für Erfolg. Ich habe dafür zu dem Schluss gekommen, dass das Bild nicht im aktuellen Verzeichnis gesucht wird - was mich auf den Punkt bringt. wo das Bild gesucht?

Hier ist ein Test-Code, die zeigen, was ich tue:

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();
    }
}
War es hilfreich?

Lösung

Mit dieser Funktion kann den HTML-Text für die JLabel zu Anzeigebildern in Bezug auf die Verpackung einer Klasse vorzubereiten.

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

Die Funktion den Inhalt des „src“ -Attribut ersetzen, um es an die Provider-Klasse relativ zu machen.

Beispiel:

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

Wie auch immer für einen echten HTML-Unterstützung Verwendung JEditorPane.

Andere Tipps

Ich sehe zwei Varianten:

Ich weiß nicht, warum, aber für mich diese Werke

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

, dass s.png Annahme, daß in der aktuellen Arbeitsverzeichnis.

Eine andere Variante, die besser geeignet für mich scheint, ist:

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

Warum sind Sie es sogar wie dies zu tun? Verwenden Sie einfach diesen JLabel(Icon image) Konstruktor

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

Oder wenn Sie darauf bestehen, auf der HTML-Variante.

btw Das Dateiprotokoll verwendet 3 Schrägstriche (file://s.png ist ungültig) und file:///s.png würde bedeuten, C:\s.png. Wenn die Bild liegt in dem Startverzeichnis können Sie verwenden.

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

Aber ich mache keine Garantien über die zweite Lösung.

i Ihre

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

und das Problem

gelöst

Hinweis: i platziert, um die s.png Datei im src / java-Ordner

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top