2013-02-27 25 views
6

Khi bạn setContentType ("text/html"), nó chỉ được áp dụng cho văn bản được đặt qua JTextPane.setText(). Tất cả các văn bản khác, được đưa vào JTextPane thông qua các kiểu là "miễn dịch" đối với loại nội dung.setContentType ("text/html") cho JTextPane không hoạt động như mong đợi

Dưới đây là những gì tôi có nghĩa là:

private final String[] messages = {"first msg", "second msg <img src=\"file:src/test/2.png\"/> yeah", "<img src=\"file:src/test/2.png\"/> third msg"}; 

public TestGUI() throws BadLocationException { 
    JTextPane textPane = new JTextPane(); 
    textPane.setEditable(false); 
    textPane.setContentType("text/html"); 

    //Read all the messages 
    StringBuilder text = new StringBuilder(); 
    for (String msg : messages) { 
     textext.append(msg).append("<br/>"); 
    } 
    textPane.setText(text.toString()); 

    //Add new message 
    StyledDocument styleDoc = textPane.getStyledDocument(); 
    styleDoc.insertString(styleDoc.getLength(), messages[1], null); 

    JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

    //add scrollPane to the main window and launch 
    //... 
} 

Nói chung, tôi có một cuộc trò chuyện đó được đại diện bởi JTextPane. Tôi nhận được tin nhắn từ máy chủ, xử lý chúng - thiết lập màu văn bản cho các trường hợp cụ thể, thay đổi dấu hiệu nụ cười thành đường dẫn hình ảnh, v.v. mọi thứ được thực hiện trong phạm vi HTML. Nhưng vì nó có thể được nhìn thấy rõ ràng từ ví dụ trên, chỉ có setText là chủ đề của setContentType ("text/html") và phần thứ hai, trong đó thông điệp mới được thêm vào được biểu diễn bằng "text/plain" (nếu tôi không nhầm).

Có thể áp dụng loại nội dung "văn bản/html" cho tất cả dữ liệu được chèn vào JTextPane không? Không có nó, hầu như không thể xử lý các thông điệp mà không cần triển khai các thuật toán rất phức tạp.

Trả lời

9

Tôi không nghĩ rằng bạn nên sử dụng phương pháp insertString() để thêm văn bản. Tôi nghĩ bạn nên sử dụng một cái gì đó như:

JTextPane textPane = new JTextPane(); 
textPane.setContentType("text/html"); 
textPane.setEditable(false); 
HTMLDocument doc = (HTMLDocument)textPane.getDocument(); 
HTMLEditorKit editorKit = (HTMLEditorKit)textPane.getEditorKit(); 
String text = "<a href=\"abc\">hyperlink</a>"; 
editorKit.insertHTML(doc, doc.getLength(), text, 0, 0, null); 
+0

Tôi thực sự cảm thấy tôi là nhà phát triển không hiệu quả (cảm thấy tôi mới lập trình và lập trình GUI). Đôi khi tôi cảm thấy rằng Java Swing thiếu rất nhiều tính năng tốt và một nên thực hiện chúng mình nhưng kinh nghiệm của tôi không cho phép tôi làm điều đó và nó rối loạn cho tôi rất nhiều. Biến thể của bạn thậm chí còn lớn hơn Joop Eggen - nó linh hoạt hơn, nếu người ta có thể nói như vậy. – Dragon

+0

Câu trả lời đầy đủ hơn, nên nhận Chấp nhận. –

+0

@JoopEggen, (Offtopic) Họ có một chút khác biệt, nhưng cả hai đều tốt. Tôi cần phải kiểm tra chúng trong bối cảnh đầy đủ - đó là những gì tôi làm bây giờ :) – Dragon

3

REEDIT

Xin lỗi, tôi đã hiểu nhầm vấn đề: chèn chuỗi dưới dạng HTML. Đối với một mà cần phải dùng đến khả năng HTMLEditorKit:

  StyledDocument styleDoc = textPane.getStyledDocument(); 
      HTMLDocument doc = (HTMLDocument)styleDoc; 
      Element last = doc.getParagraphElement(doc.getLength()); 
      try { 
       doc.insertBeforeEnd(last, messages[1] + "<br>"); 
      } catch (BadLocationException ex) { 
      } catch (IOException ex) { 
      } 
+0

Cảm ơn, tôi không tin nó có thể dễ dàng như vậy. – Dragon

1

Đây là cách đơn giản hơn nhiều để làm điều đó.

JTextPane pane = new JTextPane(); 
pane.setContentType("text/html"); 

pane.setText("<html><h1>My First Heading</h1><p>My first paragraph.</p></body></html>"); 
+0

Điều này không áp dụng nếu bạn đang sử dụng chức năng pane.getDocument(). InserString (...) để thêm văn bản vào JTextPane –

+0

những gì tôi muốn. Cảm ơn –

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