雖然有很多空閒時間可用,但我遇到了一個有關StyledDocument作爲JTextPane一部分的問題。 當文檔的總大小達到值x(在我的情況下爲10.000)時,我想刪除文本的第一部分。但是由於重要的是要保持佈局,讓我先告訴你圖像中發生了什麼,之後我會發布源代碼。刪除StyledDocument的一部分First-in-Last-Out並保持佈局
在圖像1:當尚未達到最大長度,我沒有水平滾動
在圖像2:當達到10.000字符的最大長度,並且StyledDocument中的被裁剪與styleddoc.getDocument ().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消息作爲估計的最大負載。 (最壞的情況(或最好的情況,取決於視角))
沒有人有遠程相同的問題呢? –