我正在使用JTextPane
打印聊天消息,实施:
private HTMLEditorKit kit;
private HTMLDocument doc;
ta = new JTextPane();
ta.setEditable(false);
ta.setContentType("text/html");
sbrText = new JScrollPane(ta);
sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sbrText.setBorder(null);
doc = (HTMLDocument)ta.getDocument();
kit = (HTMLEditorKit)ta.getEditorKit();
正在插入消息:
try {
kit.insertHTML(doc, doc.getLength(), "<div style=\"padding-top:10px;
padding-bottom:10px;\" id=\"X\">" + "<div>" + from + " at
" + tid + ":</div>" + "<div style=\"padding-top:4px;" +
align + "\">" + msg + "</div>" + "</div>", 0, 0, null);
} catch (BadLocationException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
每条消息(div)都会获得一个唯一的ID,我想选择一个特定的ID并更新该html插入内容。
这可能吗?
答案 0 :(得分:4)
这是可能的。您可以从JTextPane
获取文档并使用getDefaultRootElement()
获取DOM的根目录。然后经历所有孩子和儿童元素。对于他们每个人使用getAttributes()
并检查是否有ID属性。然后检查属性值。
当您使用Element
的方法
HTMLDocument
时
public void setOuterHTML(Element elem, String htmlText)
答案 1 :(得分:0)
由于每个DIV都有唯一的ID,因此您可以使用getElement
类中的HTMLDocument
方法来准确获取相关的DIV。因此,您不需要遍历整个DOM扫描具有ID属性的元素并比较ID。
虽然setOuterHTML
允许您替换给定元素的内容,但它也会替换元素本身。您需要的是setInnerHTML
,正如其名称所暗示的那样,不会触及包含的标签。
总而言之,您尝试做的代码将遵循以下几行:
public void replaceContents (String sID, String sContents) {
try {
doc.setInnerHTML (doc.getElement (sID), sContents);
} catch (BadLocationException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
希望有所帮助!