Поддержка новой строки HTML JTextPane - PullRequest
3 голосов
/ 06 октября 2009

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

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

    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, и это выглядит глупо.

Ответы [ 3 ]

8 голосов
/ 05 ноября 2009

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

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

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

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

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

textPane1.getDocument().putProperty(DefaultEditorKit.EndOfLineStringProperty, "<br/>\n")
0 голосов
/ 04 марта 2012

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

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

...