2013-02-27 18 views
6

ContentType ("text/html") ayarladığınızda, yalnızca JTextPane.setText() ile ayarlanmış olan metin için uygulanır. JTextPane'e stiller üzerinden gönderilen diğer tüm metinler, içerik türüne "bağışıklık kazandırır".setContentType ("text/html") beklendiği gibi çalışmaz

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

, ben JTextPane tarafından temsil edilmektedir sohbet: Burada

ne demek olduğunu. Sunucudan mesaj alıyorum, bunları işleyin - belirli durumlar için metin rengini ayarlayın, gülümseme işaretlerini resim yoluna vb. Değiştirin. Her şey HTML sınırları içinde yapılır. Açıkça Yukarıdaki örnekte de görülebileceği gibi, sadece setText eklenen yeni mesaj tarafından temsil edilmektedir setContentType ("text/html") ve ikinci bölümde, konu olan "metin/düz" (yanılmıyorsam eğer).

o JTextPane sokulduğu ve tüm verilere "text/html" içerik türünü uygulamak mümkün mü? Bu olmadan, çok karmaşık bir algoritmanın uygulanmasına gerek kalmadan mesajların işlenmesi neredeyse imkansızdır.

cevap

9

Sana metin eklemek için insertString() yöntemini kullanarak gerektiğini sanmıyorum. Sanırım şu gibi bir şey kullanmalısın:

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

Ben gerçekten verimsiz geliştirici olduğumu hissediyorum (swing ve GUI programlama için yeni olduğumu teftiş). Bazen, Java Swing'in birçok iyi özellikten yoksun olduğunu ve bunların kendisinin uygulanması gerektiğini hissediyorum. Ancak tecrübelerim bunu yapmama izin vermiyor ve beni çok üzüyor. Değişkeniniz, Joop Eggen'den bile daha büyüktür - eğer daha isabetli ise, daha esnektir. – Dragon

+0

Daha eksiksiz bir cevap, Kabul et. –

+0

@JoopEggen, (Offtopic) Bunlar biraz farklı, ama ikisi de iyi. Ben tam bağlamda onları kontrol etmek gerekir - bu Şimdi ne yaptığım olduğunu :) – Dragon

3

reedit

Üzgünüm, sorunu yanlış: HTML olarak bir dize ekleme. O biri için HTMLEditorKit yetenekleri başvurmak gerekir:

  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

Teşekkürler, bu kadar kolay olabileceğine inanmıyorum. – Dragon

1

Bunu yapmanın çok daha kolay bir yolu.

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

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

Bu, JTextPane –

+0

Bu oldu metin eklemek için pane.getDocument() inserString (...) işlevini kullanıyorsanız geçerli değildir. istediğim. Teşekkürler –