2009-10-06 8 views
2

J'utilise un JTextPane pour éditer du HTML. Lorsque j'entre les nouvelles lignes dans le composant GUI et appelez getText() sur le JTextPane, j'obtiens une chaîne avec des caractères de retour à la ligne. Si je crée ensuite un nouveau JTextPane et que je transmets le même texte, les retours à la ligne sont ignorés.HTML JTextPane newline support

Pourquoi JTextPane n'insère-t-il pas une balise <br> lors de la saisie d'une nouvelle ligne? Y a-t-il une bonne solution pour cela?

JTextPane test = new JTextPane(); 
    test.setPreferredSize(new Dimension(300, 300)); 
    test.setContentType("text/html"); 
    test.setText("Try entering some newline characters."); 
    JOptionPane.showMessageDialog(null, test); 
    String testText = test.getText(); 
    System.out.println("Got text: " + testText); 
    // try again 
    test.setText(testText); 
    JOptionPane.showMessageDialog(null, test); 
    testText = test.getText(); 
    System.out.println("Got text: " + testText);   

Exemple de sortie:

<html> 
    <head> 

    </head> 
    <body> 
    Try entering some newline characters. 
What gives? 
    </body> 
</html> 

Je me rends compte que je pouvais convertir les nouvelles lignes à des sauts de ligne HTML avant d'appeler setText, mais qui transformerait les sauts de ligne après les balises HTML et BODY aussi bien, et semble stupide.

Répondre

8

J'ai résolu cela, le problème était le texte brut que je transmettais dans setText. Si je sors l'appel à setText, le résultat de JTextPane.getText() est bien HTML formaté avec des sauts de ligne correctement codés.

Je crois quand j'appelle JTextPane.setText("Try entering some newline characters") il place le HTMLDocument.documentProperties.__EndOfLine__ à "\ n". Cette constante de propriété de document est définie here.

La solution est de vous assurer que vous enveloppez votre texte dans <p> balises lors du passage à la méthode JTextPane.setText() (note, l'attribut de style est utilisé pour tous les paragraphes suivants):

textPane1.setText("<p style=\"margin-top: 0\">Try entering some newline characters</p>"); 

Ou , après avoir passé en texte clair, remplacer le EndOfLineStringProperty (ce qui est plus d'un hack, je ne le recommanderais pas):

textPane1.getDocument().putProperty(DefaultEditorKit.EndOfLineStringProperty, "<br/>\n") 
0

Il semble que la classe HTMLWriter mange la nouvelle ligne et ne la lise pas ou ne la traduise pas en HTML (voir la ligne 483 dans HTMLWriter). Je ne vois pas un moyen facile de contourner cela car il semble être codé en dur pour vérifier '\ n.' Vous pourriez être en mesure de définir la propriété DefaultEditorKit.EndOfLineStringProperty du document de JTextPane (via getDocument(). PutProperty) à <br> puis de remplacer setText pour remplacer "\ n" par <br>. Bien que cela va faire ce que vous avez suggéré et ajouter des pauses entre les balises html, tête et corps, de sorte que vous pourriez vouloir faire le remplacement uniquement dans les balises de corps. Il ne semble pas qu'il y ait une façon très directe de le faire.

0

je me débattais avec celui-ci pour une demi-journée. Ceci est encore cassé dans Java 7. Le problème est de garder la nouvelle ligne entrée par l'utilisateur dans le JEditorPane (pour le type de contenu HTML). J'ai seulement pu conserver la nouvelle ligne en HTML quand j'ai ajouté une touche de marqueur, "\ r", à l'entrée de l'utilisateur "\ n" (toujours besoin de "\ n" pour afficher une nouvelle ligne dans l'éditeur) un "\ n < br/>" lorsque j'ai extrait tout le contenu et que je l'ai placé dans un autre JEditorPane ou un HTML quelconque. Je l'ai seulement testé sur Windows.

((AbstractDocument) jEditorPane.getDocument()).setDocumentFilter(new HtmlLineBreakDocumentFilter()); 

// appears to only affect user keystrokes - not getText() and setText() as claimed 
public class HtmlLineBreakDocumentFilter extends DocumentFilter 
{ 
    public void insertString(DocumentFilter.FilterBypass fb, int offs, String str, AttributeSet a) 
         throws BadLocationException 
    { 
     super.insertString(fb, offs, str.replaceAll("\n", "\n\r"), a); // works 
    } 

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) 
     throws BadLocationException 
    { 
     super.replace(fb, offs, length, str.replaceAll("\n", "\n\r"), a); // works 
    } 
} 


String str = jEditorPane.getText().replaceAll("\r", "<br/>"); // works 
jEditorPane2.setText(str); 
+0

Quelle est votre sortie désirée de getText()? Qu'obtenez-vous? –