2013-02-27 256 views
6

सेट करता है जब आप कंटेंट टाइप ("टेक्स्ट/एचटीएमएल") सेट करते हैं तो यह केवल JTextPane.setText() के माध्यम से सेट किए गए पाठ के लिए लागू होता है। शैलियों के माध्यम से जेटीक्स्टपेन में डाला गया अन्य सभी टेक्स्ट सामग्री प्रकार के लिए "प्रतिरक्षा" है।JTextPane के लिए setContentType ("टेक्स्ट/एचटीएमएल") काम नहीं करता है क्योंकि यह

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

सामान्य तौर पर, मैं एक चैट कि JTextPane का प्रतिनिधित्व करती है है:

यहाँ मैं क्या मतलब है। मुझे सर्वर से संदेश प्राप्त होते हैं, उन्हें संसाधित करते हैं - विशिष्ट मामलों के लिए टेक्स्ट रंग सेट करें, इमेज पथ आदि में स्माइल मार्कर बदलें। सब कुछ HTML की सीमाओं के भीतर किया जाता है। लेकिन जैसा कि उपरोक्त उदाहरण से स्पष्ट रूप से देखा जा सकता है, केवल सेटटेक्स्ट सेटकंटेंट टाइप ("टेक्स्ट/एचटीएमएल") का विषय है और दूसरा भाग, जहां नया संदेश जोड़ा गया है "टेक्स्ट/सादा" (यदि मुझे गलत नहीं है)।

क्या JTextPane में डाले गए सभी डेटा पर "टेक्स्ट/एचटीएमएल" सामग्री प्रकार लागू करना संभव है? इसके बिना, जटिल जटिल एल्गोरिदम के कार्यान्वयन के बिना संदेशों को संसाधित करना लगभग असंभव है।

उत्तर

9

मुझे नहीं लगता कि आप का उपयोग करना चाहिए insertString() विधि पाठ जोड़ने के लिए है। मुझे लगता है कि आपको कुछ ऐसा उपयोग करना चाहिए:

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

मुझे सच में लगता है कि मैं अक्षम डेवलपर हूं (इसके बावजूद मैं स्विंग और जीयूआई प्रोग्रामिंग के लिए नया हूं)। कभी-कभी मुझे लगता है कि जावा स्विंग में बहुत अच्छी सुविधाएं हैं और उन्हें खुद को लागू करना चाहिए, लेकिन मेरा अनुभव मुझे ऐसा करने नहीं देता है और यह मुझे बहुत परेशान करता है। आपका संस्करण जोओप एजेन से भी बड़ा है - यदि कोई ऐसा कह सकता है तो यह अधिक लचीला है। – Dragon

+0

एक और पूर्ण उत्तर, स्वीकार करना चाहिए। –

+0

@JoopEggen, (ऑफटॉपिक) वे थोड़ा अलग हैं, लेकिन दोनों अच्छे हैं। मुझे उन्हें पूर्ण संदर्भ में जांचना होगा - यह अब मैं करता हूं :) – Dragon

3

reedit

क्षमा करें, मैं इस समस्या को गलत समझा: HTML के रूप में एक स्ट्रिंग डालने। है कि एक के लिए 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

धन्यवाद, मुझे विश्वास नहीं है कि यह इतना आसान हो सकता है। – Dragon

1

ऐसा करने का एक बहुत ही आसान तरीका है।

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

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

यदि आप pane.getDocument() का उपयोग कर रहे हैं तो यह लागू नहीं होता है। आपके JTextPane –

+0

पर टेक्स्ट जोड़ने के लिए inserString (...) फ़ंक्शन मैं क्या चाहता हूँ। धन्यवाद –