Obecnie używam JTextPane, aby umożliwić użytkownikom dodawanie/edytowanie tekstu. Pozwala na pogrubienie/kursywę/podkreślenie (i planuję zezwolić na linki w przyszłości). Pozwala także użytkownikom na wrzucanie przycisków, które są wstawiane jako style niestandardowe. Panel wygląda następująco:Jak wypisać zawartość stylu JTextPane do HTML, w tym niestandardowy styl?
< < obraz usunięte>>
Chciałbym, aby móc zapisać/treść obciążenia jako HTML - zawartość zostanie przyjęta w Flash SWF. Jestem w stanie uzyskać zawartość jako HTML tak:
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();
}
Działa to dobrze jeśli JTextPane obejmuje tylko pogrubienie/kursywa/tekst podkreślony. Wynik jest jednak zbyt skomplikowany. Chcę być w stanie wyjściowym moim niestandardowym stylu, jak dobrze, ale gdy próbuję Dostaję taki błąd:
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)
Mój styl zwyczaj tak jak jest włożona (CID jest ciągiem znaków jak „{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
funkcja createRefButton (ciąg 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 zastępuje toString, która zwraca "{" + CID +"}”.
Co chciałbym wiedzieć: czy powinienem zmodyfikować sposób wstawiania "stylu", aby uzyskać ten błąd?
Czy istnieje inny/lepszy sposób, aby uzyskać HTML z tego JTextPane? Chcę tylko znaczników HTML pogrubionych/pochyłych/podkreślonych tekstów, niezbyt skomplikowanych, tak jakbym musiał potem usunąć niepotrzebny HTML, a "styl" wyjść jako button.toString().
Czy powinienem wdrożyć własną metodę toHTML(), zawijając pogrubiony/pochylony/podkreślony tekst z wymaganymi tagami? Nie mam nic przeciwko temu (w pewnym sensie wolałbym to), ale nie wiem, jak uzyskać style dla danego dokumentu JTextPane. Przypuszczam, że gdybym był w stanie uzyskać te style, mógłbym je przetworzyć, zawijając stylizowany tekst w odpowiednich tagach?
Idealnie, obrazujący zawartości JTextPane byłoby wyjście jak:
<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>
Chcę móc czytać HTML wyjście do JTextPane a także - po raz kolejny nie przeszkadza pisanie mój własne metody fromHTML() dla tego, ale muszę być w stanie najpierw uzyskać HTML.
Dziękuję za poświęcenie czasu na przeczytanie mojego pytania.
Nie znam odpowiedzi na twoje pytanie, ale proszę zastąpić niestandardową metodę OutputStream najwyższą głosowaną odpowiedzią na zadane pytanie, np. Użyj ByteArrayOutputStream. –
Zrobione, dziękuję Dave. –