Это походит на такой простой вопрос, но я испытываю такие трудности с ним.
У меня есть некоторый текст для вставки в HTMLDocument
. Этот текст иногда указывает некоторый HTML также. НАПРИМЕР:
Some <br />Random <b>HTML</b>
Я использую HTMLEditorKit.insertHTML
вставить его при указанном смещении. Это хорошо работает, если смещение не в начале документа (смещение = 1). Когда дело обстоит так текст вставляется в head
из документа вместо body
.
editorKitInstance.insertHTML(doc, offset, "<font>"+stringToInsert+"</font>", 0, 0, HTML.Tag.FONT);
Я использую тег шрифта так я теперь, что я вставляю, будет в теге шрифта без атрибутов, таким образом, он не произведет формат. Я должен знать это потому что последний параметр, insertTag
, требуется и я не могу знать содержание stringToInsert
до времени выполнения. Если уже существует текст в документе (такой как "1234567890") затем, это - вывод:
<html>
<head>
</head>
<body>
<p style="margin-top: 0">
1234567890 <font>something <br />Some <br />Random <b>HTML</b></font>
</p>
</body>
</html>
Однако, если смещение равняется 1, и документ пуст, это - результат:
<html>
<head>
<font>Some <br />Random <b>HTML</b></font>
</head>
<body>
</body>
</html>
JEditorPane
. Если существует лучший способ заменить текст в a JEditorPane
с потенциальным HTML я был бы открыт для тех идей также.Любая справка ценилась бы.Спасибо!
Есть несколько вещей, которые вам следует знать о внутренней структуре HTMLDocument.
javax.swing.text.AbstractDocument $ Content
. Сюда также входят теги title и script. Аргумент позиции / смещения ЛЮБОГО документа и функции набора редактора относится к тексту в этом экземпляре Content! Вы должны определить начало элемента тела, чтобы правильно вставить содержимое в тело. Кстати: даже если вы не определили элемент body в своем HTML, он будет автоматически сгенерирован парсером. ... ...
" - есть только одна позиция (относящаяся к экземпляру Content) для "в конце первый пролет »,« между пролетами »и« в начале второго пролета ». Для решения этой проблемы в HTMLDocument API есть 4 функции:
В заключение: для общих решений вы должны найти элемент BODY, чтобы сообщить документу о «insertAfterStart» тела и в начале смещение элемента body.
Следующий фрагмент должен работать в любом случае:
HTMLDocument htmlDoc = ...;
Element[] roots = htmlDoc.getRootElements(); // #0 is the HTML element, #1 the bidi-root
Element body = null;
for( int i = 0; i < roots[0].getElementCount(); i++ ) {
Element element = roots[0].getElement( i );
if( element.getAttributes().getAttribute( StyleConstants.NameAttribute ) == HTML.Tag.BODY ) {
body = element;
break;
}
}
htmlDoc.insertAfterStart( body, "<font>text</font>" );
Если вы уверены, что заголовок всегда пуст, есть другой способ:
kit.read( new StringReader( "<font>test</font>" ), htmlDoc, 1 );
Но это вызовет исключение RuntimeException, если заголовок не пуст.
Между прочим, я предпочитаю использовать JWebEngine для обработки и рендеринга HTML-содержимого, поскольку он разделяет заголовок и содержимое, поэтому вставка в позицию 0 всегда работает.