Как использовать insertString для добавления строки в JEditorPane с HTML
Какая разница между этим
conversationPane.setText(msg + conversationPane.getText());
и это?
conversationPane.setText(conversationPane.getText() + msg);
Я знаю, что вторая строка не печатает сообщение, но почему!? Я делаю чат, и новые сообщения должны появляться под предыдущим сообщением (как в обычном чате), но с первой строкой новые сообщения появляются во всем разговоре.
Я использую JEditorPane с типом содержимого HTML, потому что содержимое чата смайлики и все такое, если я изменю тип содержимого на textPlain, вторая строка работает отлично.
Я ищу решение и нахожу вещи с помощью insertString, используя Document и Attributes, но я не понимаю, как их использовать и может ли это решить мою проблему.
2 ответа
Я не знаю точно, почему. Однако я знаю, что это связано с добавлением текста после </html>
тег. Когда ты setText()
на JEditorPane с text/html
Тип содержимого, <html>
теги добавляются автоматически.
Я сталкивался с подобной проблемой раньше. Я исправил это, сохранив весь текст в строке, а затем установив его на панели:
String s = "";
...
s += msg;
conversationPane.setText(s);
Используйте метод insertBeforeStart из HTMLDocument. Пример Scala:
//set basic document structure
text = "<html><title></title><body><span id='Text'></span></body></html>"
//get Document as HTMLDocument
val htmlDoc = peer.getDocument.asInstanceOf[javax.swing.text.html.HTMLDocument]
//get span element with id=Text, before which text will be inserted
val bottomText = htmlDoc.getElement("Text")
//append function with optional line feed
def appendXml(xml:String, lineFeed:Boolean) = { htmlDoc.insertBeforeStart(bottomText, s + (if (lf) "<br>" else "" )); }