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.
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. –
Xong, cảm ơn Dave. –