Speicherkapazität einer JTextArea

Aloha,

mir ist auf Anregung eines Freundes die Idee gekommen ein kleines Mehrspieler-Kartenspiel umzusetzen. Auf Grund einiger Regelabweichungen kann es dabei zu einem (fast) endlosen Spielfluss kommen. Zusätzlich möchte ich jeden Spielzug in einer TextArea protokollieren. Wie man das umsetzt ist ja eher weniger das Problem. Meine Frage geht in die Richtung : irgendwann wird es halt ziemlich viel, und ich hab mir halt Gedanken gemacht : wie viel protokoliert man denn nun ? Es geht dabei dann eher um die Performance mit der dann halt neue Einträge hinzukommen wenn die TextArea sagen wir mal z.B. schon mit 1MB an Daten gefüllt ist. Sollte man ab einem gewissen Punkt dann ältere Einträge wieder rausnehmen oder braucht man sich dabei eher weniger Sorgen zu machen ? Und wenn ja : einfach mit setText(getText().substring()) oder gibt es einen anderen Weg ?

btw : Ja, ich weis : man sollte eigentlich FX nutzen, aber da bin ich noch nicht so drin und würde daher mit Swing arbeiten.

Swing hat in meiner oberflächlichen Erfahrung durchaus die Eigenschaft, manche Dinge mit 10fach nötigem Platz zu speichern, besonders paar (kleine) Bilder sprengen schnell den Standardspeicher von 64 MB,
andererseits sollte String einfach zu handeln sein,
andererseits wiederum gerade bei folgenden eher abschreckenden Link gelandet, wenn auch über JTextPane, was einiges mehr macht
http://www.javalobby.org/forums/thread.jspa?threadID=15319

ich wollte gerade auch im Quellcode schönen simplen StringBuilder-Aufruf zu Tage bringen,
aber irgendwo bei PlainDocument und GapContent habe ich doch lieber aufgegeben, JTextArea ist auch nicht ohne…,
verwendet zumindest Standard-Document-Klassen die auch Undo können,

allgemein dann zumindest noch die einfachsten Erkenntnisse zum besten gegeben:
setText(getText().substring()) ist auf jeden Fall für sich ungünstig, gerade hinsichtlich Performance- statt Speicher-Frage,
damit wird der gesamte Text durchgeschüttelt, 1 MB Aufwand,

ok, substring() selber ist vielleicht noch so schlau, das große char[] des alten Strings weiterzuverwenden, aber was dann setText() arbeiten muss?

beim Hinzufügen/ Vergrößern wäre String-Arbeit direkt in jedem Fall mit aufwendiger Kopie beschäftigt

StringBuffer und StringBuilder gehören an dieser Stelle einfach mal erwähnt, allgemein wichtig, damit Hinzufügen und auch Entfernen schnell gemacht,
allerdings außerhalb der JTextArea wohl nicht so hilfreich: nach jeder Änderung den String aus dem Builder zu holen, zu generieren und mit setText() zu übergeben wird genauso mächtig Arbeit machen, evtl. 2x, je nach Aufwand von setText() intern


hmm, das ist mir nun bisher vager als ich am Anfang plante, aber nun noch ein gewisser Schwung:
A)
doch lieber ganz auf JTextArea setzen und auf günstige Implementierung intern hoffen, zumindest wenig Änderungsaufwand,
Entfernen mit replaceRange:

Einfügen naheliegend mit der append()-Methode

B)
Testen und Messen, was JTextArea leisten kann :wink:

C)
Ideenschmiede gleich weiterziehend:
die Logeinträge als Strings oder höhere Objekte (zusätzliche Daten Uhrzeit, Wichtigkeit usw.) in einer Liste speichern,
in einer JTable anzeigen, mit eigenem Model welches immer nur die aktuell benötigten angezeigten 20 liefert,
da liegt die Datenkontrolle voll bei dir und MB-große Strings, ob zu verändern oder nicht, kommen nicht vor

Es mag verrückt wirken, aber … einfach mal ein KSKB gebastelt und Lorem Ipsum in eine JTextArea geschaufelt, bis es kracht? :wink:

Gut, hinzufügen mit append() war schon klar, die Frage mit dem setText() war eher wie gesagt besogen auf des “Löschen” der vorherigen Zeilen gedacht.
An die Panes hatte ich so gar nicht gedacht. Aber scheint ja wohl auch genau wie die Area nicht so toll zu sein bei wirklich sehr langen Inhalten.
Die Idee mit der JList klingt soweit am vernünftigsten. So kann ich schön mit High-Level-Objekten arbeiten und brauch dann dafür nur eine Hand voll anstatt mich ggf mit extrem langen Strings rumärgern zu müssen. Und wenns in ein File geloggt werden soll ist das ja auch schnell noch mit reingedrückt.

Bezüglich des KSKB und einfach mal “vollmüllen” : ja klar geht schon, spiegelt dann aber nur meine aktuelle IST-Performance wieder von der ich nicht wirklich auf Andere schließen kann.

Trotzdem auf jeden Fall danke für den Input, ich denke ich werd das mit der JList und wenn gewünscht nem zusätzlichen Logger machen.