Domanda

che sto cercando di fare JLabel mostrano un html che fa riferimento a un'immagine utilizzando un percorso relativo. Ma non posso fare JLabel individuare l'immagine. Funziona bene quando sto usando percorso assoluto.

Ho provato a fare funzionare il programma da riga di comando o da Eclipse e dialogo aggiungere per farmi vedere dove è la directory di lavoro corrente, ma per inutilmente. Ho Perciò è giunto alla conclusione che l'immagine non viene cercato nella directory corrente - che mi porta al punto. dove è l'immagine cercata?

: ecco un codice di prova che mostrano quello che sto facendo:

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();
    }
}
È stato utile?

Soluzione

Questa funzione consente di preparare il testo HTML per il JLabel per visualizzare le immagini relative al pacchetto di una 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 funzione di sostituire il contenuto dell'attributo "src" per rendere più rispetto alla classe fornitore.

Esempio:

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

In ogni caso per un uso JEditorPane vero supporto HTML.

Altri suggerimenti

Vedo due varianti:

Non so perché, ma per me questo funziona

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

assumendo che s.png si trova nella directory di lavoro corrente.

Un'altra variante che sembra più appropriato per me è:

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

Perché ci fai in questo modo? Basta usare questo costruttore 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 se ti ostini alla variante HTML.

btw Il protocollo di file utilizza 3 barre (file://s.png è valido) e file:///s.png significherebbe C:\s.png. Se l'immagine si trova nella directory di partenza è possibile utilizzare.

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

Ma faccio nessuna garanzia circa la seconda soluzione.

Ho appena sostituito il tuo

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

e che risolto il problema

Nota: ho messo il file s.png nella cartella src / java

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top