2009-02-21 13 views
7

Mam JEditorPane utworzone przez ten sposób:pokazujące obrazy na jeditorpane (Java Swing)

JEditorPane pane = new JEditorPane("text/html", "<font face='Arial'>" + my_text_to_show + "<img src='/root/img.gif'/>" + "</font>"); 

Ja to okienko na JFrame.

Tekst jest wyświetlany poprawnie, ale nie widzę obrazu, jest tylko kwadrat wskazujący, że nie powinno być zdjęcie (tj: „łamany” pokazany przez przeglądarki, gdy obraz nie został znaleziony)

Odpowiedz

8

Musisz podać rodzaj i uzyskać zasób. To wszystko. Mój testowany przykład, ale nie jestem pewien co do formowania. Nadzieję, że to pomaga:

import java.io.IOException; 
import javax.swing.JEditorPane; 
import javax.swing.JFrame; 

public class Test extends JFrame { 

    public static void main(String[] args) throws Exception { 
     Test.createAndShowGUI(); 
    } 

    private static void createAndShowGUI() throws IOException { 

     JFrame.setDefaultLookAndFeelDecorated(true); 

     JFrame frame = new JFrame("HelloWorldSwing"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     String imgsrc = 
      Test.class.getClassLoader().getSystemResource("a.jpg").toString(); 
     frame.getContentPane().add(new JEditorPane("text/html", 
      "<html><img src='"+imgsrc+"' width=200height=200></img>")); 
     frame.pack(); 

     frame.setVisible(true); 
    } 
} 
+0

Próbowałem już w ten sposób i otrzymałem wyjątek o zerowym wskaźniku :( – Giancarlo

+0

Nie wiem, skąd wziął się wyjątek, ale możesz wypróbować mój przykład i umieścić a.jpg w tym samym katalogu z tym możesz ją skompilować jako javac Test.java && uruchom test java, a ponieważ nie ustawiłem rozmiaru okna, możesz ustawić go na większy, aby zobaczyć obraz. – michal

+1

(ClassLoader.getSystemResource to metoda statyczna. lepszy wybór.) –

4

JEditorPane korzysta HTMLDocument.getBase zlokalizować względnych adresów URL, tak więc jeśli wyświetlanie treści z katalogu, upewnij się, aby ustawić bazę w dokumencie html więc postanawia Względne adresy URL do katalogu podstawowego.

W zależności od tego, gdzie faktycznie ten obraz się znajduje, można rozszerzyć HTMLEditorKit + HTMLFactory + ImageView i zapewnić niestandardową implementację ImageView, która jest odpowiedzialna za odwzorowanie adresu URL atrybutu na adres URL obrazu.

0

Użyłem tego, gdy pracowałem w sieci, ale działało. Myślę, że trochę modyfikacji, czy program powinien działać poza NetBeans

String imgsrc=""; 
try { 
    imgsrc = new File("passport.jpg").toURL().toExternalForm(); 
} catch (MalformedURLException ex) { 
    Logger.getLogger(EntityManager.class.getName()).log(Level.SEVERE, null, ex); 
} 
//System.out.println(imgsrc); use this to check 
html = "<img src='" + imgsrc + "' alt='' name='passport' width='74' height='85' /><br />"; 
//use the html ... 

jeśli uruchomić ze słoika, plik obrazu musi być na tym samym poziomie katalogu, ... w rzeczywistości, plik obrazu musi znajdować się w tym samym katalogu co twój wpis wykonawczy.

+1

* "jeśli uruchamiasz z słoika, plik obrazu musi znajdować się na tym samym poziomie katalogu, ..." * Rot! Zobacz źródła w [tej odpowiedzi] (http: // stackoverflow.com/questions/6373621/loading-images-from-jars-for-swing-html/6373907 # 6373907), który demonstruje sposób ładowania obrazów według względnych odniesień, a także jak używać elementu 'base' w kodzie HTML. Podstawę można również ustawić jawnie w metodach 'JEditorPane'. –

3

Żadne z powyższych pracował dla mnie, jednak 'imgsrc = new File("passport.jpg").toURL().toExternalForm();' pozwól mi spróbować i mieć każdy obraz w html mieć poprzedzający „file:” tak, że teraz brzmi:

<img src="file:passport.jpg" /> 

i że działa dobrze dla mnie.

1

Jeśli chcesz określić względną ścieżkę do obrazu.

Załóżmy, że struktura folderów projektu jest następujący:

sample_project/images
sample_project/images/loading.gif
sample_project/src
sampler_project/src/package_name

Teraz tag obraz będzie wyglądać następująco:
"<img src='file:images/loading.gif' width='100' height='100'>"

Yaay!