首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除StyledDocument后进先出的一部分并保留布局

删除StyledDocument后进先出的一部分并保留布局
EN

Stack Overflow用户
提问于 2012-11-15 06:32:24
回答 1查看 1.2K关注 0票数 1

虽然有相当多的空闲时间可以使用,但我遇到了一个关于作为JTextPane的一部分的StyledDocument的问题。当文档的总大小达到值x(在我的例子中是10.000)时,我希望删除文本的第一部分。但由于保持布局是很重要的,让我先向您展示图像中发生了什么,然后我将发布源代码。

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

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

http://i.stack.imgur.com/i10KZ.png图像1

http://i.stack.imgur.com/dUZ0K.png图像2

(非常抱歉,因为这是我在这里的第一个问题,所以我不被允许发布图片作为垃圾邮件拒绝措施)

如你所见,horizontar滚动条突然出现,我的布局完全混乱,在任何情况下,当文本不适合时,它会被整齐地分成几行,就像删除之前一样。

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

代码语言:javascript
复制
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字符保留在帐户中,即使是一个部分被删除。我已经尝试了几种方法,甚至只使用简单的“文档”而不是样式的文档,但这是没有选择的,因为我计划在我的聊天小程序中实现颜色和表情的使用。

每一个人都要在事前感谢他们对此的关注!我会尽可能多地跟进。

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

附言:为什么我要移除StyledDocument的一部分?内存管理,因为这是聊天小程序的一部分,最多可供200人同时使用,并且当每个人每10秒说一次话时,一分钟后就会有1200条消息,这将使用大量内存,假设这种情况持续10小时:估计最大负载为720.000条消息。(最坏的情况(或最好的情况,取决于观点))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-27 02:00:34

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13388532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档