2009-10-06 1 views
2

Я использую JTextPane для редактирования HTML. Когда я ввожу новые строки в компоненте GUI и вызываю getText() на JTextPane, я получаю строку с символами новой строки. Если я затем создаю новую JTextPane и передаю тот же текст, новые строки будут проигнорированы.HTML поддержка новой строки HTML JTextPane

Почему JTextPane не вставляет знак <br> при вводе новой строки? Есть ли хороший способ для этого?

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

Пример вывода:

<html> 
    <head> 

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

Я понимаю, что я мог бы преобразовать символы новой строки в перерывах HTML строки перед вызовом SetText, но это было бы преобразовать символ новой строки после тегов HTML и BODY, а также, и кажется немым.

ответ

8

Я решил это, проблема заключалась в том, что текст был простым текстом, который я вводил в setText. Если я выведу вызов на setText, результат JTextPane.getText() - это хорошо отформатированный HTML с корректным кодированием строк.

Я считаю, что когда я звоню JTextPane.setText("Try entering some newline characters"), он устанавливает HTMLDocument.documentProperties.__EndOfLine__ в "\ n". Эта константа свойства документа определена here.

Решение, чтобы убедиться, обернуть текст в <p> теги при передаче его в JTextPane.setText() метод (примечание, атрибут стиля используется для любых последующих пунктов):

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

Или , после того, как вы передаете в виде обычного текста, замените EndOfLineStringProperty (это больше хака, я бы не рекомендовал его):

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

Похоже, что класс HTMLWriter ест новую строку и не читает ее или не переводит в HTML (см. Строку 483 в HTMLWriter). Я не вижу легкого пути вокруг этого, поскольку он, кажется, жестко закодирован для проверки на \ n. Возможно, вы можете установить свойство DefaultEditorKit.EndOfLineStringProperty документа JTextPane (через getDocument(). PutProperty) до <br>, а затем переопределить setText, чтобы заменить «\ n» на <br>. Хотя это будет делать то, что вы предложили, и добавить перерывы между тегами html, head и body, так что вы можете захотеть сделать замену только в тегах тела. Не похоже, что есть очень прямой способ сделать это.

0

Я боролся с этим в течение половины дня. Это все еще нарушено в Java 7. Проблема заключается в том, что новая строка вводится пользователем в JEditorPane (для типа содержимого HTML). Я только смог сохранить новую строку в HTML, когда я добавил маркерный ключ «\ r», на введенном пользователем «\ n» (по-прежнему нужно «\ n» отобразить новую строку в редакторе), а затем заменить его на a "\ n < br/>", когда я вытащил весь контент и поместил его в другую JEditorPane или что угодно в качестве HTML. Я тестировал это только на 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

Каков ваш желаемый результат от getText()? Что вы получаете? –