2009-10-11 37 views
5

Tôi hiện đang sử dụng JTextPane để cho phép người dùng thêm/chỉnh sửa văn bản. Nó cho phép in đậm/nghiêng/gạch dưới (và tôi dự định cho phép các liên kết trong tương lai). Nó cũng cho phép người dùng thả các nút vào, được chèn dưới dạng kiểu tùy chỉnh. Bảng điều khiển trông giống như:Cách xuất nội dung theo kiểu JTextPane sang HTML, bao gồm cả kiểu tùy chỉnh?

< < hình ảnh bị xóa>>

Tôi muốn để có thể lưu nội dung tải/dưới dạng HTML - nội dung sẽ được đưa vào một swf Flash. Tôi có thể nhận nội dung dưới dạng HTML như vậy:

 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(); 
    } 

Điều này làm việc tốt nếu JTextPane chỉ bao gồm văn bản in đậm/nghiêng/gạch chân. Đầu ra là quá phức tạp mặc dù. Tôi cũng muốn có thể xuất phong cách tùy chỉnh của mình, nhưng khi tôi cố gắng nhận được lỗi này:

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) 

Kiểu tùy chỉnh của tôi được chèn như vậy (cID là một chuỗi như "{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 

chức năng createRefButton (string CID):

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, mà trả "{" + CID +"}".

Điều tôi muốn biết: tôi có nên sửa đổi cách tôi chèn "Kiểu" để nhận lỗi này không?

Có cách nào khác tốt hơn để tôi lấy HTML từ JTextPane này không? Tất cả những gì tôi muốn là các thẻ HTML xung quanh văn bản in đậm/in nghiêng/gạch dưới, không quá phức tạp như thể tôi sẽ phải loại bỏ HTML không cần thiết và để "kiểu" xuất hiện dưới dạng button.toString().

Hoặc tôi có nên triển khai phương thức của riêng mình cho phương thứcHTML(), bao gồm văn bản in đậm/in nghiêng/gạch chân với các thẻ bắt buộc không? Tôi không nhớ làm điều này (trong một số cách tôi thích nó), nhưng tôi không biết làm thế nào để có được phong cách cho các tài liệu JTextPane nhất định. Tôi cho rằng nếu tôi có thể có được những kiểu này, tôi có thể lặp qua chúng, gói văn bản theo kiểu trong các thẻ thích hợp?

Một cách lý tưởng, nội dung JTextPane hình sẽ được xuất ra như:

<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> 

Tôi muốn để có thể đọc đầu ra HTML vào các JTextPane cũng - một lần nữa tôi không nhớ viết của tôi của riêng mình từ phương thứcHTML() cho điều này, nhưng trước tiên tôi cần có khả năng nhận HTML.

Cảm ơn bạn đã dành thời gian đọc câu hỏi của tôi.

+1

Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng hãy thay thế OutputStream tùy chỉnh đó bằng câu trả lời được bỏ phiếu cao nhất cho câu hỏi được tham chiếu, tức là sử dụng ByteArrayOutputStream. –

+0

Xong, cảm ơn Dave. –

Trả lời

3

Sau khi đọc:

tôi đã viết xuất khẩu HTML của riêng tôi:

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; 
    } 
    } 

Không w Tôi cần phải viết mã để nó có thể làm ngược lại: chuyển đổi HTML đầu ra thành một StyledDocument.

Đầu tiên, cà phê.

+3

Đẹp nhất. Bạn hỏi, bạn đã nhận xét, bạn đã trả lời và bạn đã chấp nhận. – Petah

+0

Bạn có bao giờ đi lại để viết nửa kia không? – nyxaria

Các vấn đề liên quan