Moin,
ich möchte eine JTable mit Daten aus einer MySQL-Datenbank füllen. Das ist soweit kein Thema. Nun ist wegen der Anzahl der Daten, Größe der Tabelle und Netzwerkanbindung das Starten der Maske recht langsam. Daher meine Frage:
Wie kann ich die JTable sagen wir mit 100er Datensätzen sukzessive füllen/scrollen lassen? D.h. beim Öffnen der Maske werden die ersten 100 Datensätze eingelesen, und beim Scrollen nach oben/unten jeweils in 100er Blöcken Daten nachgeladen. Geht das, wenn ja, wie?
Meines wissens gibt es da keine vorhandene Funktion. Du müsstest daher wohl über die Scrollpane abfragen ob gescrollt wurde und wohin, anschließend müsstest du dann rausbekommen welche/wieviele Zeilen du siehst und dementsprechend neue laden.
Wobei wenn du nur nachladen willst reicht es eigentlich abzufragen ob nach untengescrollt wurde und nach einer bestimmten Menge musst du dann halt neuladen (die Menge musst du halt rausbekommen)
warum scrollen und nicht eine seitenbasierte anzeige machen…
also sagen wir du hast 100 Eintraege insg. auf eine Seite kommen 10. Also hast du 10 Seiten. Die Daten werden erst dann geladen wenn der User die bestimmte Seite anwaehlt. Bei wiederholtem Auswaehlen wird sie dann aus dem Cache geholt
naja du könntest einfach 2 Buttons machen vor/zurück und wenn man draufdrückt werden halt die Datensätze geladen und angezeigt (die alten kannst du ja irgendwo zwischenspeichern wenn sie sich nicht ändern)
Das ist nicht ganz praktikabel. Es befinden sich schon eine Menge Daten in der DB, man müsste sehr oft blättern, um in die Mitte oder ans Ende zu gelangen. Ans Ende wäre dabei noch einfach umzusetzen, aber an eine beliebige Stelle mitten in den Datensätzen zu scrollen wäre bei Deinem Vorschlag nicht möglich.
kannst ja zusätzlich ne Combobox machen Auswahl/Eingabe für Seite oder Startwert
Zusätzlich vielleicht noch ne Möglichkeit zu sagen wieviele pro Seite kommen sollen.
Wieso ermittelst du nicht einfach erstmal die gesamt anzahl der Daten die du hast ?
Holst dir dann z.b die ersten 100. Im Tabelmodel legst du initial alle an, wobei einige nur “stellvertretter” sind >100.
So kann man scrollen ohne das man blättern muss. Sind nun einträger >100 sichtbar könntest du diese mittels eines Background Threads laden.
z.B mittels SwingWorker oder einem Executor/FutureTask (Java 5).
Vorteil ist das du elegant an die Ergebnisse des neben läufigen Threads kommen kannst (FutureTask#get() bzw es prüfen kannst FutureTask#isDone()) ohne das die abfrage blockiert!!!). Nebenbei ließen sich sogar Tasks abrechen was für eine gute GUI nicht unrelevant ist.
Das eigendliche nachladen muss im Model des Tabels angestossen werden, hierfür muss du ein wenig experimentieren. Ich habe sowas selbst für meinen künftigen Music Player geschrieben der ID3 Tags etc nachlädt sobald die Daten sichtbar werden (der User scrollt dahin).
Über das model kannst du dann auch die GUI veranlassen das die GUI sind aktualisiert sobald du die Daten geladen hast.
Aufpassen muss du wenn der User z.b schnell in der liste scrollt,
hier können eine menge an konkurierenden anfragen an die DB gestellt werden. Die DB interresiert das sicher weniger, auf Client seite hast du aber ein problem,
deshalb würde ich die anfragen in eine Queue stellen und nacheinander abarbeiten (Ab Java 5 wird hier einiges geboten, gerade im zusammenhang mit FutureTask).
In deinem tablemodel hast du also sowas wie einen Decorator:
public class Decorator
{
private EinObject object = null;
// impl. alle methoden des eigendlichen objects.
public getName()
{
if(object!=null)
{
return object.getName();
}
return "Daten werden gerade geladen - bitte warten";
}
...
// sobald das eigentliche Object geladen wurde stellst du es dem decorator zur Verfügung
public void setEigendlichesObject(EinObject o)
{
this.object = o;
}
}
PS: Ich weiß das der Name Decorator hier nicht ganz richtig ist aus Pattern sicht
Hi dbac,
DataPaging ist wirklich nicht praktikabel für unseren Kunden, der Scrollen gewohnt ist. Wir reden auch von über 40.000 Datensätzen=Zeilen.
Die Idee von Mac-Systems gefällt mir da besser, darauf werde ich einen Blick werfen. Kommt mir auch irgendwoher bekannt vor. Ich glaube ein ehem. Arbeitksollege aus meiner früheren Firma hatte das so oder so ähnlich umgesetzt. Das finde ich sicher wieder dank Datensicherung.
Dass „screw that“ so übersetzt wird, hätte ich nicht gedacht. :o
Aber Star Whores ist sicher nicht Krieg der Huren, sondern Sternen-Huren oder Star-Huren.
[QUOTE=Snape]Dass “screw that” so übersetzt wird, hätte ich nicht gedacht. :o
Aber Star Whores ist sicher nicht Krieg der Huren, sondern Sternen-Huren oder Star-Huren. ;)[/QUOTE]
ja screw that ist slang fuer “so n scheiss” oder “ach fuck” allgemein sowas
das mit den Sternen leichten Frauen stimmt… mein fehler
Öhm Mac, ich hab zwar nur die Hälfte verstanden, aber Code kann ich lesen.
Die Methode in Decorator müsste so heißen: public String getName()
@dbac, ist das witzig, weil man die Worte ähnlich/gleich auspricht und man es verwechseln kann?
Find das gar nicht so lustig, aber OK, britischen Humor hab ich noch nie verstanden…