2013-02-27 9 views
6

Po ustawieniuContentType ("text/html") jest stosowane tylko dla tekstu ustawionego za pomocą JTextPane.setText(). Wszystkie inne teksty, które są umieszczane w JTextPane za pośrednictwem stylów, są "odporne" na typ zawartości.setContentType ("text/html") dla JTextPane nie działa tak jak się oczekuje

Oto co mam na myśli:

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 
    //... 
} 

W ogóle, mam czat, który jest reprezentowany przez JTextPane. Otrzymuję wiadomości z serwera, przetwarzam je - ustaw kolor tekstu dla konkretnych przypadków, zmieniaj znaczniki uśmiechu na ścieżkę obrazów itp. Wszystko jest robione w granicach HTML. Ale jak widać wyraźnie z powyższego przykładu, tylko setText jest przedmiotem setContentType ("text/html"), a druga część, gdzie dodana nowa wiadomość jest reprezentowana przez "text/plain" (jeśli się nie mylę).

Czy można zastosować typ zawartości "text/html" do wszystkich danych wstawianych do JTextPane? Bez tego przetwarzanie wiadomości bez implementacji bardzo złożonego algorytmu jest prawie niemożliwe.

Odpowiedz

9

Nie sądzę, należy używać metody insertString(), aby dodać tekst. Myślę, że powinieneś używać coś w rodzaju:

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

Naprawdę czuję, że jestem nieefektywnym programistą (mimo że jestem nowy na swing i programowanie GUI). Czasem czuję, że Java Swing nie ma wielu dobrych cech i należy je sam wdrożyć, ale moje doświadczenie nie pozwala mi tego zrobić i bardzo mnie to denerwuje. Twój wariant jest nawet większy niż Joop Eggen - jest bardziej elastyczny, jeśli można tak powiedzieć. – Dragon

+0

Bardziej pełna odpowiedź, powinna otrzymać Accept. –

+0

@JoopEggen, (Offtopic) Są trochę inne, ale oba są dobre. Muszę sprawdzić je w pełnym kontekście - to jest to, co teraz robię :) – Dragon

3

przeredagować

Niestety, źle zrozumiałem problem: wstawianie ciąg jako HTML. Do tego trzeba uciekać się do możliwości 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

Dzięki, nie wierzę, że to może być takie proste. – Dragon

1

Oto znacznie prostszy sposób na zrobienie tego.

+0

Nie dotyczy to, jeśli używasz funkcji pane.getDocument(). InsertString (...), aby dodać tekst do JTextPane –

+0

To było czego chcę. Dzięki –

Powiązane problemy