Wie limitieren Sie die Anzahl der Zeilen in JTextArea?

7

Ich versuche eine GUI für einen Dienst zu erstellen, die einen JTextArea hat, um Nachrichten anzuzeigen, jede Nachricht wird in eine einzige Zeile geschrieben und bei Bedarf mit einem Wordwrapping versehen.

Die Nachrichten kommen über einen Socket, also ist es nur ein .append (Nachricht), das ich benutze, um die JTextArea zu aktualisieren, ich muss diese Zeilen auf 50 oder 100 begrenzen und ich muss die Anzahl der Zeichen nicht auf jedem beschränken Linie.

Wenn es eine Methode gibt, um die Anzahl der Zeilen in der JTextArea zu begrenzen oder wenn es eine alternative Methode dafür gibt?

Ich könnte wirklich die Hilfe in dieser Angelegenheit gebrauchen.

Bearbeiten

Das Problem ist, dass jeder Client unendliche Zeilen senden kann, alle diese Zeilen müssen lesbar sein, also ist dies keine einfache Überprüfung der Anzahl der Zeilen in der JTextArea. Ich muss ältere Zeilen entfernen, um neuere Zeilen anzuzeigen.

    
Ralph Andreasen 28.08.2012, 13:13
quelle

4 Antworten

6

Wäre das effizienter?

%Vor%     
yan bellavance 08.05.2015, 22:24
quelle
6

Verwenden Sie dies , um Zeile und Spalte zu erhalten

Fügen Sie einen DocumentFilter hinzu, der die Anzahl der Zeilen überprüft (übergeben Sie den doc.getLength () - Offset) und verhindern, dass mehr Text hinzugefügt wird.

Oder Sie können eine Dummy-unsichtbare JTextArea erstellen und den gesamten Text dort hinzufügen. Messen Sie dann die letzte erlaubte Linie und schneiden Sie den Text aus.

    
StanislavL 28.08.2012 13:54
quelle
6

Unten ist ein primitiver DocumentFilter, der scheinbar funktioniert. Der grundlegende Ansatz besteht darin, das Einfügen / Anhängen passieren zu lassen, die Anzahl der Zeilen nach der Tatsache abzufragen, wenn mehr das Maximum, Zeilen am Anfang entsprechend entfernen.

Achtung: Die mit den textArea-Methoden gezählten Zeilen sind (höchstwahrscheinlich auf die Bestätigung von @Stani wartend) lines-between-cr, nicht die tatsächlichen Zeilen als layouted. Abhängig von Ihren genauen Anforderungen, können sie Ihnen entsprechen oder nicht (wenn nicht, verwenden Sie die Stan's Utility-Methoden)

Ich war überrascht und nicht ganz sicher, ob es sicher ist

  • überrascht: Die Einfügemethode wird nicht aufgerufen, um stattdessen die Ersetzungsmethode zu implementieren (im produktionsfertigen Code wahrscheinlich beides)
  • nicht sicher, ob die textArea garantiert aktuelle Werte in den Filtermethoden liefert (wahrscheinlich nicht, dann kann die Längenprüfung in ein invokeLater eingebunden werden)

Irgendein Code:

%Vor%     
kleopatra 28.08.2012 14:45
quelle
1

Mein Ansatz arbeitet mit dem Inhalt des JTextPane als Dokument. Es geht davon aus, dass Ihr Programm Text immer wieder an das Ende des Dokuments angehängt hat, so dass Sie beim Aufruf von doc.getCharacterElement (1) grundsätzlich ein Blattelement erhalten, das die früheste Codezeile darstellt. Dies ist, was wir löschen wollen, also erhalten wir die Anfangs- und Endoffsets dieses Elements und rufen die remove-Methode auf, um den frühesten Text zu schneiden.

Dies kann selektiv ausgeführt werden, indem geprüft wird, ob die Anzahl der Zeichen insgesamt größer als eine Million ist (wie ich unten getan habe) oder basierend auf der Anzahl der Zeilen, die Sie bereits hinzugefügt haben.

Wenn Sie auf der Anzahl der bereits hinzugefügten Zeilen basieren möchten, benötigen Sie ein Feld, das bei jedem Druck auf JTextPane inkrementiert wird, so dass dieser Code jedes Mal ausgeführt wird, wenn Sie eine neue Textzeile und den Text drucken Anzahl übersteigt Ihren maximalen Wert.

%Vor%

Prost!

    
Thomas Adkins 01.06.2015 23:10
quelle

Tags und Links