Percorso relativo a JLabel HTML
-
22-09-2019 - |
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();
}
}
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