虽然有相当多的空闲时间可以使用,但我遇到了一个关于作为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滚动条突然出现,我的布局完全混乱,在任何情况下,当文本不适合时,它会被整齐地分成几行,就像删除之前一样。
现在,这是我的消息来源。请帮我找到这个问题的天才解决方案。
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条消息。(最坏的情况(或最好的情况,取决于观点))
发布于 2013-09-27 02:00:34
你的问题有很多不同的部分,但其中一部分可能很容易解决。听起来您主要关心的是如何从文档中删除行。有人已经实现了一个为您处理此方面的DocumentListener。查看LimitLinesDocumentListener。该页面链接到类的源代码,其中还包含有关如何从文档中删除行的示例。
https://stackoverflow.com/questions/13388532
复制相似问题