# Maximale Zeilenanzahl einer JTable erweitern



## xcr (23. Dez 2008)

Nun denken sich sicher einige: 


> Schon wieder so ein Spinner dem 130.000.000 Zeilen nicht reichen? Der soll doch seine Daten filtern, soviel kann eh kein mensch anzeigen wollen.



Wenn mir einer sagen kann wie das einfach geht, gerne.

Hier also mein Problem: Einen Teil meiner Anwendung bildet ein Bitviewer, welcher die einzelnen Bits einer Datei anzeigt. Die Anzahl der Spalten beträgt dabei zwischen 8 und 64, wobei 16 Standard ist (daneben werden noch die entsprechenden Bytes als ANSI-Codierte Symbole etc. angezeigt). 

Nun übersteigt schon die Anzeige einer 600 MB Datei die maximalen Zeilen bei weitem, also benötige ich ein paar Ideen wie man sowas realisieren könnte.
Das Problem ist ja bekanntlich die Höhe der Tabelle. Meine Idee wäre nun eine Wrappertabelle zu schreiben, die prinzipiell aus einer Menge von Offset-Tabellen besteht. Die Wrappertabelle hat eine bestimmte, festgelegte Höhe und zeigt jeweils einen entsprechenden Ausschnitt aus einer der kleinen Offset-Tabellen. OT0 geht etwa von Zeile 0 bis 99999999, OT1 von 99999899 bis 199999898 usw.

Haltet ihr ein solches Vorgehen für sinnvoll oder hat jemand eine Alternative?
Es wäre vermutlich ein Haufen Arbeit, daher frage ich vorher einfach mal.

Achja bevor einer meckert: nein ich halte die Informationen zum Inhalt NICHT komplett im Speicher 

MfG xcr


----------



## Marco13 (23. Dez 2008)

Und sowas soll mit einem RowFilter nicht gehen ???:L  (Hab den noch nie "echt" benutzt....deswegen frag' ich)

Aber so ein TableModel, das einen Ausschnitt aus einem anderen TableModel repräsentiert, ist nicht so aufwändig. Sowas hatte ich mal gebastelt http://www.java-forum.org/de/viewtopic.php?t=74037&highlight=tablemodelutils Hab' es gerade mal für die potentielle Verwendung bei "großen" Tabellen optimiert: Mit 
RangeTableModel rangeTableModel = TableModelUtils.createSubTableModel(tableModel, minRow, minCol, maxRow, maxCol);
kann man sich ein RangeTableModel erstellen, das den angegebenen Ausschnitt des gegeben TableModels repräsentiert. Mit 
rangeTableModel.setRange(minRow, minCol, maxRow, maxCol);
kann (wenn man das will) man diesen Ausschnitt nachher noch verändern.

Vielleicht kannst/willst du es nicht direkt so verwenden, aber vielleicht hilft es als Inspiration oder Ausgangspunkt für dein eigenes "Range"TableModel.

BTW: Vom Konzept her spricht da IMHO nichts dagegen: Ein TableModel ist nur eine _Ansicht_ auf _irgendwelche_ Daten - das TableModel verwendet man sozusagen(!) nur, um festzulegen, welche Daten in einer JTable angezeigt werden. Z.B. werden bei einem TableSorter ja auch keine echten Daten echt sortiert, sondern nur ein TableModel angeboten, das eine _sortierte Ansicht_ auf bestehende Daten liefert.


----------



## xcr (23. Dez 2008)

Das mit dem RowFilter ist schonmal ein Ansatz den ich mir genauer ansehen will. Ich habe das bisher noch nie gesehen, danke für den Hinweis.
Ich mache mir derzeit noch Sorgen, dass es mit der Scrollbar Probleme geben könnte aber das werde ich ja demnächst direkt beim Experimentieren sehen.

Ich melde mich, wenn ich entweder iene Lösung oder mehr Fragen habe :]


----------



## André Uhres (24. Dez 2008)

Von einer gewissen Grösse an wird die JTable mehr als eine Seite scrollen, wenn du die Scrollbar nur ankuckst  :lol:
In dem Fall wäre die JTable wohl unbrauchbar und die Standardbegrenzung sinnvoll.


----------



## xcr (24. Dez 2008)

Das ist wohl wahr, ich habe da auch schon drüber nachgedacht.
Aus diesem Grund wird man auch mit den Tasten Cursor hoch/runter und Bild auf/ab arbeiten können.

Ich habe beim Testen der Anwendung jedoch fast immer mein Jump-To-Bit oder Skit-Bits-Eingabefeld benutzt, meist bekommt man genaue Positionen durch irgendein Feld angegeben und navigiert da hin. Wenn ich scrolle dann eh fats immer mit der Maus und das bekomm ich so hin, dass max. 1 Seite gescrollt wird.

Momentan schiebe ich das Problem noch vor mir her, ist ja Weihnachten (naja fast... Heilig Abend immerhin), also frohe Weihnachten von mir an euch


----------



## voidee (24. Dez 2008)

Warum bewegst du Dich nicht mittels Dateipointers durch die Datei und zeigst dann immer nur einen entsprechenden Teil an?

Zeigst du die Datei wirklich bitweise oder doch byteweise an?


----------



## xcr (24. Dez 2008)

Also es sind tatsächlich die einzelnen Bits die ich anzeige. Mein Anzeigemodell unterstützt alternativ auch die Anzeige als Bytes in Oct, Dez, Hex und als ANSI-Symbol aber grundsätzlich können auch die Bits dargestellt werden.

Genau zu erklären warum es bitweise sein muss würde vermutlich den Rahmen des Topics sprengen. Die Anwendung wird eine Umsetzung des sogenannten Bitstream Segment Graph werden, welcher zur Annotation von Dateiformatspezifischen Strukturen in Binärdateien verwendet wird (wer genaueres zu dem Thema wissen möchte kann z.B. googeln).

Das Problem ist wie gesagt nicht die Datenmenge, sondern die Scrollpane bzw die JTabel drin. Derzeit verwende ich ein Datenmodell, welches einen bestimmten Bereich puffert daher konstant in der Speicherbelegung arbeitet, egal wie groß die Eingabedatei ist. Eines der Probleme hat André schon angesprochen. Nehmen wir (übertrieben) an, die Tabelle hat eine Köhe von 10000000000000000000 Pixeln und man bewegt den Slider um 1 Pixel, dann springt die Scrollpane um 20 Seiten weiter. Das ignoriere ich jetzt aber erstmal. Viel gravierender wäre das Problem, dass man irgendwann aus den so gelieferten Koordinaten nicht mehr die Zeile bestimmen könnte weil die Koordinaten den Integer-Bereich verlassen.

Daher überlege ich ernsthaft waghalsige Konstrukte zu ersinnen aber davor habe ich noch Angst


----------



## xcr (6. Jan 2009)

Hey Leute, ich hoffe alle sind gut ins neue Jahr gekommen.

Mittlerweile bin ich das Problem im Übrigen los. Ich habe nun eine sogenannte OffsetTabelle, welcher eine maximale Zeilenanzahl X übergeben wird. Ist die eigentliche Anzahl der Zeilen größer als X, so werden mehrere Seiten emuliert. Wird etwa die maximale Zeilenanzahl 10 festgelegt und eine Tabelle hätte 25 Zeilen, dann resultieren daraus 3 kleine Tabellen (10, 10 und 5 Zeilen). Gründsätzlich ist es die selbe Tabelle (dasselbe Objekt), betrachtet man jedoch die 2. Seite, dann würde in der ersten Zeile die wahre Zeile #11 angezeigt.

Eigentlich nicht sehr kompliziert und ich finde es sehr übersichtlich.


----------

