J'utilise actuellement un JTextPane pour permettre aux utilisateurs d'ajouter/modifier du texte. Il permet gras/italique/souligné (et je prévois d'autoriser des liens dans le futur). Il permet également aux utilisateurs de déposer des boutons, qui sont insérés en tant que styles personnalisés. Le panneau ressemble:Comment afficher le contenu de style JTextPane en HTML, y compris le style personnalisé?
< < image supprimée>>
Je voudrais être en mesure d'enregistrer/charger le contenu en HTML - le contenu sera incorporé dans un swf Flash. Je suis en mesure d'obtenir du contenu en HTML comme ceci:
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();
}
Cela fonctionne bien si le JTextPane ne comprend que gras/italique/souligné. La sortie est trop compliquée cependant. Je veux être en mesure de sortie mon style personnalisé aussi bien, mais quand j'essaie je reçois cette erreur:
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)
Mon style personnalisé est inséré comme si (cid est une chaîne comme « {} 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
La fonction 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 remplace toString, qui retourne "{" + cid +"} ». Ce que je voudrais savoir: dois-je modifier la façon dont j'insère le "Style" pour obtenir cette erreur?
Y a-t-il un moyen différent/meilleur pour moi d'obtenir du HTML à partir de ce JTextPane? Tout ce que je veux, c'est des balises HTML autour du texte gras/italique/souligné, pas trop compliqué comme si je devais alors enlever le HTML inutile, et que le "style" apparaisse comme button.toString(). Ou devrais-je implémenter ma propre méthode toHTML(), en empilant le texte gras/italique/souligné avec les balises requises? Cela ne me dérange pas de le faire (d'une certaine manière je le préfère), mais je ne sais pas comment obtenir les styles pour le document JTextPane donné. Je suppose que si je pouvais obtenir ces styles, je pourrais les parcourir, en entourant le texte stylé dans les balises appropriées?
Idéalement, le contenu JTextPane photo serait sortie comme:
<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>
Je veux être en mesure de lire la sortie HTML en le JTextPane aussi bien - encore une fois, je ne me dérange pas d'écrire mon Possède la méthode fromHTML() pour cela, mais je dois d'abord sortir le HTML.
Merci d'avoir pris le temps de lire ma question.
Je ne connais pas la réponse à votre question, mais veuillez remplacer ce OutputStream personnalisé par la réponse la plus votée à la question référencée, c'est-à-dire utiliser ByteArrayOutputStream. –
Fait, merci Dave. –