嘿,我正在制作聊天应用程序,并且最初使用简单的JTextPane作为基本的颜色支持聊天视图窗格。然后我想添加html链接支持,通过添加HTML侦听器并将内容类型设置为text / html来使它们可单击。可点击链接完美地工作,但现在每次我插入一个字符串时,聊天将添加一个大空间。这是我在下面使用的代码:
构造
public JTextPaneTest() {
this.addHyperlinkListener(new LinkController());
this.setContentType("text/html");
this.setEditable(false);
}
以下是我如何附加常规文字:
public void append(Color c, String s) {
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setForeground(sas, c);
StyledDocument doc = (StyledDocument)this.getDocument();
int len = getDocument().getLength();
try {
doc.insertString(len, s, sas);
} catch (BadLocationException e) {
e.printStackTrace();
}
setCaretPosition(len + s.length());
}
以下是我如何插入链接
public void addHyperlink(URL url, String text) {
try {
Document doc = this.getDocument();
SimpleAttributeSet hrefAttr = new SimpleAttributeSet();
hrefAttr.addAttribute(HTML.Attribute.HREF, url.toString());
SimpleAttributeSet attrs = new SimpleAttributeSet();
attrs.addAttribute(HTML.Tag.A, hrefAttr);
StyleConstants.setUnderline(attrs, true);
StyleConstants.setForeground(attrs, Color.blue);
doc.insertString(doc.getLength(), text, attrs);
}
catch (BadLocationException e) {
e.printStackTrace(System.err);
}
}
无论出于何种原因将内容类型设置为基本文本,我都不会遇到此问题。
以下是一些照片: http://i.stack.imgur.com/dpMBB.png
在图片中,插入名称,然后:,然后是文本的其余部分。
编辑:无论出于何种原因,JTextPane会自动将我的InsertStrings居中。
Edit2:是否可以删除HTML插入字符串之间的边距?我已经连续几个小时都在努力,根本无法找到解决方案。我能想到的唯一可能的解决方案是每次插入字符串时通过getText / setText重新格式化文本以确保没有添加边距..
答案 0 :(得分:0)
尝试创建一个虚拟元素,并将其替换为包含该链接的外部HTML
,而不是插入文本ith属性 SimpleAttributeSet a=new SimpleAttributeSet();
a.addAttribute("DUMMY_ATTRIBUTE_NAME","DUMMY_ATTRIBUTE_VALUE");
doc.setCharacterAttributes(start, text.length(), a, false);
Element elem=doc.getCharacterElement(start);
String html="<a href='"+text+"'>"+text+"</a>";
doc.setOuterHTML(elem, html);
工作示例here
答案 1 :(得分:0)
我最终只使用基本的“文本”并使用组件进行点击检测。
要修复此问题,我使用HTML,我只是使用
editorKit.insertHTML(doc, doc.getLength(), "html code", 0, 0, null);
而不是直接使用doc的'insertString'
插入我的代码