2012-11-14 39 views
1

雖然有很多空閒時間可用,但我遇到了一個有關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]

(我很抱歉,因爲這是我在這裏的第一個問題,我不允許張貼圖片的垃圾郵件拒收措施)

正如你所看到的,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消息作爲估計的最大負載。 (最壞的情況(或最好的情況,取決於視角))

+0

沒有人有遠程相同的問題呢? –

回答

1

你的問題有很多不同的部分,但其中一個部分可能是相當簡單的修復。這聽起來像你主要關心的是如何刪除文檔中的行。有人已經實現了爲您處理這方面的DocumentListener。退房LimitLinesDocumentListener。該頁面鏈接到該類的源代碼,該頁面還提供了有關如何從文檔中刪除行的示例。

+1

有史以來最好的回覆,但嘿,信用早該過期了。我放棄了這個項目,但答案確實是我當時想要的。謝謝! –

+0

哈哈,遲到比我猜想的還要好。也許一些未來的靈魂會受益... –