2009-12-07 13 views
7

से कच्चे पाठ प्राप्त करना मेरे आवेदन में, मैं कुछ लॉग जानकारी प्रदर्शित करने के लिए JTextPane का उपयोग करता हूं। चूंकि मैं इस पाठ में कुछ विशिष्ट पंक्तियों को हाइटलाइट करना चाहता हूं (उदाहरण के लिए त्रुटि संदेश), मैंने contentType को "text/html" के रूप में सेट किया है। इस तरह, मैं अपने पाठ को प्रारूपित कर सकता हूं।JTextPane

अब, मैं एक जेबटन बनाता हूं जो क्लिपबोर्ड में JTextPane की सामग्री की प्रतिलिपि बनाता है। वह भाग आसान है, लेकिन मेरी समस्या यह है कि जब मैं myTextPane.getText() कहते हैं, मैं एचटीएमएल कोड जैसे मिलता है, यह है:

<html> 
    <head> 

    </head> 
    <body> 
    blabla<br> 
    <font color="#FFCC66"><b>foobar</b></font><br> 
    blabla 
    </body> 
</html> 

बजाय केवल कच्चे सामग्री प्राप्त करने की:

blabla 
foobar 
blabla 

वहाँ एक रास्ता है सादा पाठ में केवल JTextPane की सामग्री प्राप्त करने के लिए? या क्या मुझे HTML को कच्चे पाठ में बदलने की ज़रूरत है?

उत्तर

5

को स्वीकार कर लिया जवाब के आधार पर: इस सवाल का जवाब मैं

import java.io.IOException; 
import javax.swing.text.html.*; 
import javax.swing.text.html.parser.*; 

public class MyHtml2Text extends HTMLEditorKit.ParserCallback { 
    StringBuffer s; 
    public MyHtml2Text() {} 
    public void parse(Reader in) throws IOException { 
     s = new StringBuffer(); 
     ParserDelegator delegator = new ParserDelegator(); 
     delegator.parse(in, this, Boolean.TRUE); 
    } 
    public void handleText(char[] text, int pos) { 
     s.append(text); 
     s.append("\n"); 
    } 
    public String getText() { 
     return s.toString(); 
    } 
} 

से जुड़ा हुआ पर पाया Html2Text वर्ग के Removing HTML from a Java String

MyHtml2Text parser = new MyHtml2Text(); 
try { 
    parser.parse(new StringReader(myTextPane.getText())); 
} catch (IOException ee) { 
    //handle exception 
} 
System.out.println(parser.getText()); 

थोड़ा संशोधित संस्करण आप एक अधिक सुक्ष्म से निपटने की जरूरत है पर विचार HTMLEditorKit.ParserCallback

2

दुर्भाग्य से आपको इसे स्वयं करने की आवश्यकता है। कल्पना करें कि कुछ सामग्री HTML विशिष्ट थी, उदाहरण के लिए छवियां - पाठ का प्रतिनिधित्व अस्पष्ट है। उदाहरण के लिए Alt टेक्स्ट शामिल करें या नहीं।

2

(Is RegExp अनुमति यह पार्स करने नहीं है, यह नहीं है)

gettext() परिणाम ले लो और String.replaceAll() का उपयोग सभी टैग फिल्टर करने के लिए। अग्रणी और पिछली सफेद जगहों को हटाने के लिए एक ट्रिम() से अधिक। अपने पहले और आखिरी 'ब्लब्ला' के बीच सफेद जगहों के लिए मुझे एक सामान्य समाधान नहीं दिख रहा है। हो सकता है कि आप सीआरएलएफ के आस-पास आराम कर सकें और फिर सभी स्ट्रिंग्स को ट्रिम कर सकें।

(मैं कोई regexp विशेषज्ञ हूँ - शायद किसी regexp प्रदान करते हैं और कुछ प्रतिष्ठा अर्जित कर सकते हैं;))

संपादित

.. मैं सिर्फ मान लिया है कि आप का उपयोग नहीं करते < और > आपके पाठ में - अन्यथा यह .. कहो, यह एक चुनौती है।

16

द्वारा परिभाषित इंटरफ़ेस को अधिक कार्यान्वित करना पार्सरकॉलबैक का उपयोग करने की आवश्यकता नहीं है। बस उपयोग करें:

textPane.getDocument().getText(0, textPane.getDocument().getLength())); 
+0

यह वास्तव में वास्तव में एक अच्छा समाधान है ... सिवाय इसके कि मैंने सभी लाइन ब्रेक खो दिए हैं, और फिर मेरा अंतिम स्ट्रिंग केवल एक पंक्ति में है। बहुत बुरा, क्योंकि मुझे वास्तव में यह समाधान पसंद आया! – romaintaz

+0

हां, दस्तावेज़ लाइन ब्रेक को स्टोर नहीं करता है, जहां वे अन्य समाधान द्वारा मैन्युअल रूप से जोड़े जाते हैं। – camickr