2012-08-28 17 views
7

मैं एक सेवा के लिए एक जीयूआई बनाने की कोशिश कर रहा हूं, जिसमें संदेश देखने के लिए एक JTextArea है, प्रत्येक संदेश एक पंक्ति पर लिखा जाता है, और यदि आवश्यक हो तो वर्डप्रेस किया जाता है।JTextArea में लाइनों की संख्या को सीमित करने के लिए कैसे?

संदेश सॉकेट के माध्यम से आते हैं, इसलिए यह केवल एक .append (संदेश) है जिसे मैं JTextArea को अपडेट करने के लिए उपयोग कर रहा हूं, मुझे इन पंक्तियों को 50 या 100 तक सीमित करने की आवश्यकता है और मुझे चरित्र गणना को सीमित करने की आवश्यकता नहीं है प्रत्येक पंक्ति।

यदि JTextArea में संख्या रेखाओं को सीमित करने के लिए कोई तरीका है या यदि ऐसा करने का कोई वैकल्पिक तरीका है?

मैं वास्तव में इस मामले में सहायता का उपयोग कर सकता हूं।

संपादित

समस्या यह है कि हर ग्राहक अनंत लाइनों भेज सकते हैं, इन सभी लाइनों पठनीय होने के लिए है, इसलिए यह JTextArea में लाइनों की संख्या का एक सरल जांच नहीं है। नई लाइनों को देखने के लिए मुझे पुरानी लाइनों को हटाने की जरूरत है।

+0

यदि आप जानते हैं कि jtextarea की एक पंक्ति में कितने पात्रों की अनुमति है तो बस विभाजित करें कि jtextarea –

+0

में कुल वर्णों की संख्या से संबंधित: http://stackoverflow.com/questions/479182/how-to-limit- jtextarea-max-row-and-coloums – CloudyMarble

+0

यह केवल रेखाएं या पंक्तियां हैं जिन्हें मुझे इस मामले में सीमित करने की आवश्यकता है, इसलिए वर्णों की संख्या अप्रासंगिक है। –

उत्तर

6

क्या यह अधिक कुशल होगा?

final int SCROLL_BUFFER_SIZE = 100; 
public void trunkTextArea(JTextArea txtWin) 
{ 
    int numLinesToTrunk = txtWin.getLineCount() - SCROLL_BUFFER_SIZE; 
    if(numLinesToTrunk > 0) 
    { 
     try 
     { 
      int posOfLastLineToTrunk = txtWin.getLineEndOffset(numLinesToTrunk - 1); 
      txtWin.replaceRange("",0,posOfLastLineToTrunk); 
     } 
     catch (BadLocationException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
6

उपयोग this पाने के लिए पंक्ति और स्तंभ

एक DocumentFilter जो पंक्तियों की राशि (doc.getLength (पारित) ऑफसेट) की जांच करता है और अधिक पाठ जोड़ने को रोकने के।

या आप एक डमी अदृश्य JTextArea बना सकते हैं और वहां सभी टेक्स्ट जोड़ सकते हैं। फिर अंतिम अनुमत लाइन को मापें और पाठ को काट दें।

+0

+1, और तेज़ होने के कारण। :-) – trashgod

+0

उत्सुक: textArea.getLine/प्रारंभ/ऑफ़ ऑफ़सेट के बजाय उपयोगिता विधि का उपयोग क्यों करें? – kleopatra

+0

हैच ... लगता है कि मैंने इसे पाया: उन तरीकों से संभाली गई रेखाएं लाइन-बीच-सीआर हैं, वास्तविक लाइनों के रूप में वे लिपटे दृश्य में दिखाई देते हैं? यदि यह सच है ... क्या-एक बकवास ... – kleopatra

6

नीचे एक कच्चे दस्तावेज़फिल्टर है जो काम पर प्रतीत होता है। इसका मूल दृष्टिकोण डालने/संलग्न होने देना है, तथ्य के बाद लाइनों की संख्या से पूछताछ करें, यदि अधिकतम हो, तो शुरुआत से लाइनों को उचित रूप से हटा दें।

सावधान रहें: टेक्स्ट एरिया विधियों के साथ गिनती वाली रेखाएं हैं (संभवतः, @Stani से पुष्टि के लिए प्रतीक्षा कर रहे हैं) लाइन-बीच-सीआर, वास्तविक लाइनों को लेआउट के रूप में नहीं। अपने सटीक आवश्यकता के आधार पर, वे या आप सूट भी सकता है और नहीं (यदि नहीं, स्टेन की उपयोगिता तरीकों का उपयोग)

मैं हैरान और पूरी तरह से यकीन नहीं था अगर यह सुरक्षित है

  • हैरान: डालने विधि 'isn टी कहा जाता है, इसके बजाए प्रतिस्थापन विधि को लागू करने की आवश्यकता है (उत्पादन तैयार कोड दोनों में शायद
  • सुनिश्चित नहीं है कि टेक्स्ट एरिया फ़िल्टर विधियों में अद्यतित मान वापस करने की गारंटी है (शायद नहीं, तो लंबाई जांच हो सकती है एक invokeLater में लपेटा)

कुछ कोड:

public class MyDocumentFilter extends DocumentFilter { 

    private JTextArea area; 
    private int max; 

    public MyDocumentFilter(JTextArea area, int max) { 
     this.area = area; 
     this.max = max; 
    } 

    @Override 
    public void replace(FilterBypass fb, int offset, int length, 
      String text, AttributeSet attrs) throws BadLocationException { 
     super.replace(fb, offset, length, text, attrs); 
     int lines = area.getLineCount(); 
     if (lines > max) { 
      int linesToRemove = lines - max -1; 
      int lengthToRemove = area.getLineStartOffset(linesToRemove); 
      remove(fb, 0, lengthToRemove); 
     } 
    } 
} 

// usage 
JTextArea area = new JTextArea(10, 10); 
((AbstractDocument) area.getDocument()).setDocumentFilter(new MyDocumentFilter(area, 3)); 
1

मेरा दृष्टिकोण JTextPane की सामग्री के साथ दस्तावेज़ के रूप में काम करता है। यह मानता है कि आपका प्रोग्राम दस्तावेज़ के अंत में पाठ को ऊपर और ऊपर जोड़ रहा है, ताकि जब आप doc.getCharacterElement (1) को कॉल करते हैं, तो आपको मूल रूप से एक पत्ता तत्व मिलेगा जो कोड की सबसे पुरानी पंक्ति का प्रतिनिधित्व करता है। यही वह है जिसे हम हटाना चाहते हैं, इसलिए हमें उस तत्व के प्रारंभ और समाप्ति ऑफ़सेट मिलते हैं, और सबसे पुराना टेक्स्ट कट करने के लिए निकालें विधि को कॉल करें।

यह चुनकर चयन किया जा सकता है कि कुल वर्णों की संख्या एक लाख से अधिक है (जैसा कि मैंने नीचे किया है), या आपके द्वारा पहले से जोड़े गए लाइनों की संख्या के आधार पर।

यदि आप इसे पहले से जोड़े गए लाइनों की संख्या पर आधारित करना चाहते हैं, तो आपको प्रत्येक फ़ील्ड की आवश्यकता होगी जो हर बार जब आप JTextPane पर प्रिंट करते हैं, तो यह कोड प्रत्येक बार टेक्स्ट की एक नई पंक्ति मुद्रित करने पर एक बार चलता है और गिनती आपके अधिकतम मूल्य से अधिक है।

 JTextPane pane = ... 
     StyledDocument doc = pane.getStyledDocument(); 
     int size = doc.getLength(); 
     if (size > 1000000) { 
      out.println("Size: " + size); 
      out.println(":" + 1); 
      int i = 0; 
      Element e = doc.getCharacterElement(i + 1); 
      int start = e.getStartOffset(); 
      int end = e.getEndOffset(); 

      try { 
       doc.remove(start, end); 
      } catch (BadLocationException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

चीयर्स!

संबंधित मुद्दे