删除StyledDocument First-in-Last-Out的一部分并保留布局

时间:2012-11-14 22:32:24

标签: java layout jtextpane styleddocument

虽然有足够的空闲时间使用,但我遇到了一个关于StyledDocument作为JTextPane的一部分的问题。 当文档的总大小达到值x(在我的情况下为10.000)时,我想删除文本的第一部分。但是,由于保持布局很重要,让我先告诉你图像中发生了什么,之后我会发布信息源。

在图像1中:当尚未达到最大长度时,我没有水平滚动条

在图像2中:当达到10.000个字符的最大长度,并且使用styleddoc.getDocument()裁剪StyledDocument时.remove(0,maxsize);

http://i.stack.imgur.com/i10KZ.png [图片1]

http://i.stack.imgur.com/dUZ0K.png [图片2]

(我很抱歉,但由于这是我的第一个问题,我不允许将图片作为垃圾邮件拒绝措施发布)

如你所见,horizo​​ntar scrollbarr突然出现,我的布局完全搞砸了,在任何情况下,当文本不合适时,文本会被整齐地分成几行,就像删除之前一样

现在,这是我的来源。请帮我找到这个问题的天才解决方案。

public void publicTextPaneOutput(String sender, String receiver, int type, String message) {
    int messagesize = 0;
    StyledDocument styledDocument = (StyledDocument) publicText.getDocument();
    Style defaultStyle = styledDocument.addStyle("Default Text", null);
    Style nicknameStyle = styledDocument.addStyle("Personal Nickname", null);
    StyleConstants.setBold(nicknameStyle, true);
    StyleConstants.setForeground(nicknameStyle, Color.decode("#006400"));
    Style chatterStyle = styledDocument.addStyle("Other Nickname", null);
    StyleConstants.setBold(chatterStyle, true);
    StyleConstants.setForeground(chatterStyle, Color.blue);

    switch (type) {
        case 1: {
            messagesize += sender.length() + message.length() + 3;
            publicTextPaneOverflowProtection(styledDocument, messagesize);
            try {
                if (sender.equals(nickname)) {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), nicknameStyle);
                } else {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), chatterStyle);
                }
                styledDocument.insertString(styledDocument.getLength(), ": ", chatterStyle);
                styledDocument.insertString(styledDocument.getLength(), message, defaultStyle);
                styledDocument.insertString(styledDocument.getLength(), "\n", defaultStyle);
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
            break;
        }
        case 2: {
            messagesize += sender.length() + receiver.length() + message.length() + 7;
            publicTextPaneOverflowProtection(styledDocument, messagesize);
            try {
                if (sender.equals(nickname)) {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), nicknameStyle);
                } else {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), chatterStyle);
                }
                styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(" -> ").toString(), chatterStyle);
                if (receiver.equals(nickname)) {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(receiver).toString(), nicknameStyle);
                } else {
                    styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(receiver).toString(), chatterStyle);
                }
                styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(": ").toString(), chatterStyle);
                styledDocument.insertString(styledDocument.getLength(), message, defaultStyle);
                styledDocument.insertString(styledDocument.getLength(), "\n", defaultStyle);

            } catch (BadLocationException e) {
                e.printStackTrace();
            }
            break;
        }
    }
    scroll();
}

private void publicTextPaneOverflowProtection (StyledDocument styledDocument, int messagesize)
{
    if(styledDocument.getLength() + messagesize > 10000) {
        try {
            styledDocument.remove(0, messagesize);
        } catch (BadLocationException e) {

        }
    }

}

public void scroll() {
    StyledDocument styleddocument = (StyledDocument) publicText.getDocument();
    publicText.setCaretPosition(styleddocument.getLength());
}

// this part is coded in the class itself

private JTextPane publicText;
private JScrollPane publicTextScrollPane;

//this is coded in the constructor of the class
publicText = new JTextPane();
publicTextScrollPane = new JScrollPane();

publicText.setEditable(false);
publicTextScrollPane.setViewportView(publicText);

如果有人需要我项目某个部分的其他代码,请告诉我a.s.a.p。

我想要的解决方案应该在StyledDocument的开头实现这种删除文本,并保存已放置的\ n字符,即使是删除了一部分。 我尝试了几件事,甚至只使用一个简单的“文档”而不是一个样式,但这不是选项,因为我打算在我的chatapplet中实现颜色和表情符号的使用。

事先感谢每一个人对此进行调查! 我会尽可能地跟进。

亲切的问候, 史蒂文库斯特斯

PS。:为什么要删除StyledDocument的部分内容?内存管理,因为这是聊天Applet的一部分,可以同时由多达200人使用,当每个人每隔10秒钟说一次,一分钟后就有1200条消息,这将占用大量内存这可以说是10小时:720.000消息作为估计的最大负载。 (最坏情况(或最佳情况,取决于观点))

1 个答案:

答案 0 :(得分:1)

你的问题有很多不同的部分,但有一部分可能非常简单。听起来您主要关心的是如何从文档中删除行。有人已经实现了一个DocumentListener来为您处理这个方面。查看LimitLinesDocumentListener。该页面链接到该类的源代码,该代码还包含有关如何从文档中删除行的示例。