2009-10-11 30 views
5

मैं वर्तमान में टेक्स्ट जोड़ने/संपादित करने की अनुमति देने के लिए एक JTextPane का उपयोग करता हूं। यह बोल्ड/इटैलिक/अंडरलाइन (और मैं भविष्य में लिंक की अनुमति देने की योजना बना देता हूं) की अनुमति देता है। यह उपयोगकर्ताओं को कस्टम शैलियों के रूप में डाले जाने वाले बटन ड्रॉप करने की अनुमति देता है। छविएचटीएमएल में जेटीक्स्टपेन स्टाइल सामग्री को कस्टम स्टाइल समेत कैसे आउटपुट करें?

< < नष्ट कर दिया>>

मैं HTML के रूप में/लोड सामग्री को बचाने के लिए सक्षम होने के लिए चाहते हैं - सामग्री एक फ्लैश swf में शामिल किया जाएगा: पैनल की तरह दिखता है। मैं तो जैसे HTML के रूप में सामग्री प्राप्त करने में सक्षम हूँ:

 public String getHTMLText(){ 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try{ 
    HTMLEditorKit hk = new HTMLEditorKit(); 
    hk.write(baos, this.getStyledDocument(), 0, this.getDocument().getLength()); 

     } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (BadLocationException e) { 
     e.printStackTrace(); 
     } 
     return baos.toString(); 
    } 

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

Exception occurred during event dispatching: 
    java.lang.NullPointerException 
at javax.swing.text.html.MinimalHTMLWriter.writeAttributes(MinimalHTMLWriter.java:151) 
at javax.swing.text.html.MinimalHTMLWriter.writeStyles(MinimalHTMLWriter.java:256) 
at javax.swing.text.html.MinimalHTMLWriter.writeHeader(MinimalHTMLWriter.java:220) 
at javax.swing.text.html.MinimalHTMLWriter.write(MinimalHTMLWriter.java:122) 
at javax.swing.text.html.HTMLEditorKit.write(HTMLEditorKit.java:293) 
at javax.swing.text.DefaultEditorKit.write(DefaultEditorKit.java:152) 
at numeracy.referencetextpanel.NRefButtonTextArea.getHTMLText(NRefButtonTextArea.java:328) 
at numeracy.referencetextpanel.NInputPanelRefTextButton.getReferencedText(NInputPanelRefTextButton.java:59) 
at numeracy.referencetextpanel.NInputRefText.actionPerformed(NInputRefText.java:106) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 

मेरे कस्टम शैली इतनी तरह डाला जाता है (सीआईडी ​​की तरह एक स्ट्रिंग है "{} 0-0 "):

StyledDocument doc = this.getStyledDocument(); 

NRefButton b = this.createRefButton(cID); 

Style style = doc.addStyle(cID, null); //prepare a style 
StyleConstants.setComponent(style, b); 

doc.insertString(doc.getLength(), b.toString(), style); //insert button at index 

समारोह createRefButton (स्ट्रिंग सीआईडी):

private NRefButton createRefButton(String cID) { 

    NRefButton b = new NRefButton(_equationButtons.get(cID).getText(), cID, _equationButtons.get(cID).isStruck()); //prepare a button 

    return b; 
} 

NRefButton toString ओवरराइड करता है, जो देता है" { "+ सीआईडी ​​+"} "।

मैं क्या जानना चाहता हूं: क्या मुझे इस त्रुटि को पाने के लिए "स्टाइल" डालने के तरीके को संशोधित करना चाहिए?

क्या इस JTextPane से HTML प्राप्त करने के लिए मेरे लिए कोई अलग/बेहतर तरीका है? मैं चाहता हूं कि एचटीएमएल टैग बोल्ड/इटैलिक/रेखांकित टेक्स्ट के आस-पास है, अत्यधिक जटिल नहीं है जैसे कि मुझे अनावश्यक HTML को बाहर करना होगा, और "शैली" के लिए बटन के रूप में बाहर निकलना होगा .toString()।

या मुझे अपने स्वयं के HTML() विधि को लागू करना चाहिए, आवश्यक टैग के साथ बोल्ड/इटैलिक/रेखांकित टेक्स्ट लपेटना चाहिए? मुझे यह करने में कोई फर्क नहीं पड़ता (कुछ तरीकों से मैं इसे पसंद करूंगा), लेकिन मुझे नहीं पता कि दिए गए जेटीक्स्टपेन दस्तावेज़ के लिए शैलियों को कैसे प्राप्त किया जाए। मुझे लगता है कि अगर मैं इन शैलियों को प्राप्त करने में सक्षम था, तो मैं उचित टैग में स्टाइल टेक्स्ट को लपेटकर, उनके माध्यम से पुन: प्रयास कर सकता था? उत्पादन

आदर्श रूप में, चित्र JTextPane सामग्री के रूप में किया जाएगा:

<html><p>This is some <b>styled</b> text. It is <u>incredible</u>. 
<br/> 
<br/> 
Here we have a button that has been dropped in: {0-0}. These buttons are a <b><i>required part of this project.</i></b> 

मैं करने में सक्षम होना चाहता हूँ के रूप में अच्छी तरह से JTextPane में आउटपुट HTML पढ़ा - फिर मैं लिख कोई आपत्ति नहीं है मेरी इसके लिए HTML() विधि से स्वयं है, लेकिन मुझे पहले HTML प्राप्त करने में सक्षम होना चाहिए।

मेरे प्रश्न को पढ़ने के लिए समय निकालने के लिए धन्यवाद।

+1

मुझे आपके प्रश्न का उत्तर नहीं पता है, लेकिन संदर्भित प्रश्न के उच्चतम मतदान वाले उत्तर के साथ उस कस्टम आउटपुटस्ट्रीम को प्रतिस्थापित करें, यानी ByteArrayOutputStream का उपयोग करें। –

+0

हो गया, धन्यवाद डेव। –

उत्तर

3

के बाद पढ़ने:

package com.HTMLExport; 

    import javax.swing.text.AbstractDocument; 
    import javax.swing.text.AttributeSet; 
    import javax.swing.text.BadLocationException; 
    import javax.swing.text.Element; 
    import javax.swing.text.ElementIterator; 
    import javax.swing.text.StyleConstants; 
    import javax.swing.text.StyledDocument; 

    public class NHTMLWriter { 

    private StyledDocument _sd; 
    private ElementIterator _it; 

    protected static final char NEWLINE = '\n'; 

    public NHTMLWriter(StyledDocument doc) { 
     _sd = doc; 
     _it = new ElementIterator(doc.getDefaultRootElement()); 
    } 

    public String getHTML(){ 
     return "<html>" + this.getBody() + "</html>"; 
    } 

    protected String getBody() { 
     /* 
      This will be a section element for a styled document. 
      We represent this element in HTML as the body tags. 
       Therefore we ignore it. 
     */ 
     _it.current(); 

     Element next = null; 

     String body = "<body>"; 

     while((next = _it.next()) != null) { 
     if (this.isText(next)) { 
     body += writeContent(next); 
     } 
     else if(next.getName().equals("component")){ 
     body += getText(next); //this is where the custom component is output. 
     } 
     } 
     body += "</body>"; 

     return body; 
    } 
    /** 
     * Returns true if the element is a text element. 
     */ 
    protected boolean isText(Element elem) { 
     return (elem.getName() == AbstractDocument.ContentElementName); 
    } 
    protected String writeContent(Element elem){ 

     AttributeSet attr = elem.getAttributes(); 

    String startTags = this.getStartTag(attr); 

    String content = startTags + this.getText(elem) + this.getEndTag(startTags); 

    return content; 
    } 
    /** 
     * Writes out text 
     */ 
    protected String text(Element elem){ 
     String contentStr = getText(elem); 
     if ((contentStr.length() > 0) && (contentStr.charAt(contentStr.length()-1) == NEWLINE)) { 
     contentStr = contentStr.substring(0, contentStr.length()-1) + "<br/>"; 
     } 
     if (contentStr.length() > 0) { 
     return contentStr; 
     } 
     return contentStr; 
    } 

    protected String getText(Element elem){ 
     try { 
     return _sd.getText(elem.getStartOffset(), elem.getEndOffset() - elem.getStartOffset()).replaceAll(NEWLINE+"", "<br/>"); 
     } catch (BadLocationException e) { 
     e.printStackTrace(); 
     } 
     return ""; 
    } 
    private String getEndTag(String startTags) { 

    String[] startOrder = startTags.split("<"); 

    String tags = ""; 

    for(String s : startOrder){ 
    tags = "</" + s + tags; 
    } 

    return tags; 
    } 
    private String getStartTag(AttributeSet attr) { 

     String tag = ""; 

     if(StyleConstants.isBold(attr)){ 
     tag += "<b>"; 
     } 
     if(StyleConstants.isItalic(attr)){ 
     tag += "<i>"; 
     } 
     if(StyleConstants.isUnderline(attr)){ 
     tag += "<u>"; 
     } 

     return tag; 
    } 
    } 

नहीं:

मैं अपने खुद के एचटीएमएल निर्यातक लिखा था डब्ल्यू मुझे कोड लिखने की जरूरत है ताकि यह रिवर्स कर सके: आउटपुट एचटीएमएल को स्टाइलड डॉक्यूमेंट में बदल देता है।

पहला, कॉफी।

+3

अच्छा है। आपने पूछा, आपने टिप्पणी की, आपने उत्तर दिया और आपने स्वीकार किया। – Petah

+0

क्या आप कभी दूसरी छमाही लिखने के लिए घूमते थे? – nyxaria