2009-02-21 40 views
7

Tôi có một JEditorPane tạo bằng cách này:hiển thị hình ảnh trên JEditorPane (java swing)

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

tôi đặt cửa sổ này trên một JFrame.

Văn bản được hiển thị chính xác nhưng tôi không thể nhìn thấy hình ảnh, chỉ có hình vuông cho biết hình ảnh (ví dụ: "hình ảnh bị hỏng" được hiển thị bởi trình duyệt khi không tìm thấy hình ảnh)

Trả lời

8

Bạn phải cung cấp loại và nhận tài nguyên. Đó là tất cả. Ví dụ thử nghiệm của tôi, nhưng tôi không chắc chắn về việc định dạng. Hy vọng nó giúp:

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

Tôi đã thử cách này và tôi đã từng nhận được một ngoại lệ con trỏ null: ( – Giancarlo

+0

Tôi không biết bạn có ngoại lệ ở đâu, nhưng bạn có thể thử ví dụ của mình) và đặt a.jpg vào cùng thư mục với Bạn có thể biên dịch nó như là javac Test.java && chạy java Test.Và vì tôi chưa thiết lập kích thước của cửa sổ, bạn có thể thiết lập kích thước lớn hơn để xem hình ảnh – michal

+1

(ClassLoader.getSystemResource là một phương thức tĩnh. getResource sẽ là một lựa chọn tốt hơn.) –

4

Các JEditorPane đang sử dụng HTMLDocument.getBase để xác định vị trí các url tương đối là tốt, vì vậy nếu bạn đang hiển thị nội dung từ một thư mục, hãy chắc chắn để thiết lập căn cứ vào tài liệu html để nó giải quyết các url tương đối vào thư mục cơ sở.

Tùy thuộc vào vị trí của hình ảnh đó, bạn có thể muốn mở rộng HTMLEditorKit + HTMLFactory + ImageView và cung cấp triển khai tùy chỉnh ImageView, cũng có trách nhiệm ánh xạ URL thuộc tính tới URL hình ảnh.

0

Tôi đã sử dụng điều này khi tôi đang làm việc trong netbeans, mặc dù nó hoạt động. Tôi nghĩ rằng một thay đổi nhỏ nếu chương trình nên chạy bên ngoài của 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 ... 

nếu bạn chạy từ jar, các tập tin hình ảnh phải được trên cấp độ thư mục tương tự, ... trên thực tế, các tập tin hình ảnh phải nằm trên cùng thư mục với mục nhập thực thi của bạn.

+1

* "nếu bạn chạy từ bình, tệp hình ảnh phải ở cùng cấp thư mục, .." * Xoay! Xem các nguồn trên [câu trả lời này] (http: // stackoverflow.com/questions/6373621/loading-images-from-jars-cho-swing-html/6373907 # 6373907) minh họa cách tải hình ảnh theo các tham chiếu tương đối, cũng như cách sử dụng phần tử 'base' trong HTML. Căn cứ cũng có thể được đặt rõ ràng trong các phương thức 'JEditorPane'. –

3

Không có ở trên làm việc cho tôi, tuy nhiên 'imgsrc = new File("passport.jpg").toURL().toExternalForm();' cho tôi để thử và có mỗi hình ảnh trong html có một 'file:' trước để nó bây giờ đọc:

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

Và đó hoạt động tốt cho tôi.

1

Nếu bạn muốn chỉ định đường dẫn tương đối cho hình ảnh.

Hãy nói rằng cấu trúc thư mục dự án của bạn là như sau:

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

Bây giờ thẻ hình ảnh sẽ trông như thế này:
"<img src='file:images/loading.gif' width='100' height='100'>"

Yaay!

Các vấn đề liên quan