虽然有足够的空闲时间使用,但我遇到了一个关于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]
(我很抱歉,但由于这是我的第一个问题,我不允许将图片作为垃圾邮件拒绝措施发布)
如你所见,horizontar 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消息作为估计的最大负载。 (最坏情况(或最佳情况,取决于观点))
答案 0 :(得分:1)
你的问题有很多不同的部分,但有一部分可能非常简单。听起来您主要关心的是如何从文档中删除行。有人已经实现了一个DocumentListener来为您处理这个方面。查看LimitLinesDocumentListener。该页面链接到该类的源代码,该代码还包含有关如何从文档中删除行的示例。