每次我插入String时JTextPane都会添加大空格

时间:2015-05-03 06:48:48

标签: java html swing jframe jtextpane

嘿,我正在制作聊天应用程序,并且最初使用简单的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重新格式化文本以确保没有添加边距..

2 个答案:

答案 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'

插入我的代码