我正在尝试构建一个使用 JTextPane 来显示对话的聊天客户端。我在突出显示用户选择的聊天参与者的过去句子时遇到问题。在实现这一点时,我需要坚持使用 HTMLDocument,因为某些内容必须是 HTML。
最好的想法似乎是为参与对话的每个用户使用不同的命名样式。这个想法是,当需要突出显示特定人的文本时,我只需更新他的个人风格,他所说的一切都应该像魔术一样突出显示。不幸的是,这不起作用。
所以要添加我使用的文本:
public void addMessage(String from, String message){
HTMLDocument doc = (HTMLDocument) textPane.getStyledDocument();
if(doc != null){
try {
String stylename = "from_" + from;
if(textPane.getStyle(stylename) == null){
LOG.debug("Did not find style. Adding new: " + stylename);
Style nameStyle = textPane.addStyle(stylename, null);
StyleConstants.setForeground(nameStyle, Color.black);
StyleConstants.setBold(nameStyle, true);
}else{
LOG.debug("Found existing style: " + textPane.getStyle(stylename));
}
doc.insertString(doc.getLength(), from + ": ", textPane.getStyle(stylename));
doc.insertString(doc.getLength(), message + "\n", null);
} catch (BadLocationException ble) {
LOG.error("Could not insert text to tab");
}
}
}
到目前为止一切顺利......文本如我所愿显示在 textPane 中。但是,当我尝试在将来某个时间点更新样式表并调用时:
public void highlight(String name, boolean highlight){
Style fromStyle = textPane.getStyle("from_" + name);
if(fromStyle != null){
LOG.debug("found style, changing color");
StyleConstants.setForeground(fromStyle, Color.red);
}else{
LOG.debug("fromStyle was NULL");
}
}
..我可以看到样式被找到并且我的代码被执行——但屏幕上没有任何变化。
我想问一下您是否对我如何尝试解决此问题有任何建议。有没有办法使用命名样式来完成这项工作,或者我应该采取一些完全不同的方法?
谢谢