2013-09-05 58 views
1

我使用的是JTextPane打印出的聊天消息,执行:通过div id更新html 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); 
} 

每个消息(格)获得一个唯一的ID,我想选择一个特定的ID并更新该html插入的内容。

这可能吗?

+0

如果你想避免遍历整个DOM,也许我的答案可能有帮助。 – hqcasanova

回答

4

这是可能的。您可以从JTextPane获取文档并使用getDefaultRootElement()获取DOM的根。然后通过儿童元素的所有孩子和孩子。对于每个人使用getAttributes()并检查是否有ID属性。然后检查属性值。

当达到Element与指定的ID使用HTMLDocument的方法

public void setOuterHTML(Element elem, String htmlText) 
+0

不知道我明白如何写这可以做一个例子吗? :) – Alosyius

0
  • 选择某个ID

由于每个DIV具有唯一的ID,则可以使用getElement来自HTMLDocument类的方法来完全获取所讨论的DIV。因此,您不需要遍历整个DOM扫描中具有ID属性的元素并比较ID。

  • 更新HTML的内容插入

虽然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); 
     }  
    } 

希望帮助!