Swing Wie AutoVervollständigen bei Kundensuche realisieren?

MaikHSW

Aktives Mitglied
Hey zusammen.
Ich habe folgendes Problem:
Ich schreibe seit einiger Zeit ein Warenwirtschaftsprogramm für einen Landwirt.
Nun habe ich bereits eine Kundenanlagemaske geschrieben.
Allerdings stehe ich nun vor der Kundensuche.
Der Kunde möchte diese genau so wie bisher haben.
Bisher konnte er "Mei" eingeben und es kam Meier, Meierpiepenkötter, Meiermüller.....
Somit eine Art AutoVervollständigen mit Auswahl.
Dies kann ich aber in Java nicht aufbauen bzw. mir ist nicht klar wie das gehen soll.
Meine Kunden liegen in einer Datenbank.
Mein erster Ansatz war per select alle Kunden heraus zu holen und diese in die JComboboxen zu parsen.
Dies hat sich jedoch bereits bei 5 Testkunden irgendwo als langsam erwiesen.
Das nächste Problem wäre dort auch eine Eingabe gewesen.
Diese hätte man ggf. mit einem Eventlistener realisieren können.
Nur dieser muss auch entsprechend eingrenzen und immer reagieren ---> weiterer Verlust von Rechenzeit.
Ich habe auch überlegt dies über SQL abzufangen und bei "Mei" ein like-Select abzugeben.
Dies wird aber, je nach Bestandsgröße, auch immer langsamer bis hin zu uninteressant.
Wie würdet ihr dies machen?
Gibt es da irgendwelche sinnvollen Ansätze?
Besonders die Anzeige aller möglichen Namen mit "Mei" macht mir Kopfzerbrechen.


Gruß


Maik
 

chuyx

Mitglied
Zuletzt bearbeitet:

MaikHSW

Aktives Mitglied
Hey.
Ich habe ja nicht nur Namen,
daher sind es mehrere SQL´s, die in Resultsets gespeichert werden.
Dennoch dauert dies einfach länger.
Die Combobox bearbeitbar machen ist mir klar,
aber da habe ich ja noch keine AutoVervollständigen Thematik wie ich sie oben beschrieb.
Verstehst du, was ich meine?


Gruß
 

chuyx

Mitglied
Moin,

naja entscheidend sind doch aber nur die Namen für die Autovervollständigung + ID in der Datenbank, für eine weitere Verarbeitung (abändern anderer gespeicherter Attribute).

Und das andere verstehe ich nicht, da du mit den gespeicherten Namen ... und dem ersten vom Benutzer eingegebenen Buchstaben sowie der ComboBox als visuelle Representation, alle notwendigen Elemente hast, um eine Autovervollständigung zu schreiben.

Ablauf:
Eingabe des ersten Buchstabens => hier muss ein listener gefeuert werden => dieser schaut in den gespeicherten Namen, ob es eine Übereinstimmungen gibt => Anpassung der ComboBox
ja und das ganze halt immer wieder für jeden buchstaben der hinzugefügt bzw. gelöscht wird. da du die daten dabei nicht jedesmal vom server aus der datenbank holst, sondern diese mit einer anfrage holst und bei dir abspeicherst, sollte das von der laufzeit her kein problem sein.

lg
 
Zuletzt bearbeitet:

MaikHSW

Aktives Mitglied
Hey.
Stimmt, die Namen sind entscheidend.
Ich habe auch weitestgehend deine Logik begriffen.
Allerdings zweifelt es mir aktuell noch an der Umsetzung.
Du willst also einen EventListener bauen bzw. aktivieren, der nach jeder Eingabe los läuft und entsprechende Ergebnisse sucht.
Sprich bei "M" alles mit M und so weiter.
Dann müsste er aber bei "Me" alles mit "Ma" wieder rauskegeln,
sprich die Box komplett neu aufbauen.
Oder sehe ich da was falsch?
Das wäre quasi eine Art dynamisches Befüllen der Box, oder?

Die Ergebnisse möchtest du vorher erst in eine Datenstruktur laden.
Das wäre ja dann am ehesten ein Array, oder gibt es da optimalere Formen?
Das hieße aber im Gegenzug dass ich alles laden muss bevor ich die Kundensuche öffne.
Sprich da ist wieder die Performance fraglich.
Auch wenn diese kein Thema ist, so ist die Aktualtät der Daten wieder komplex. Wobei dies auch ginge..
Danke erstmal dass du bis hierher mit gedacht hast.

Gruß
 
C

Camino

Gast
Hallo,

ich bin auch gerade dabei, so etwas ähnliches umzusetzen. Ich hab einen Suchdialog, der beim Öffnen die Daten aus der Datenbank holt und in eine ArrayList<Person> speichert, also eine ArrayList, in der Objekte der Klasse Person gespeichert werden. Ich denke, es reicht, wenn nur bei dem Öffnen des Suchdialogs die Daten aus der Datenbank geholt werden, und die Suche selber dann aus dieser ArrayList erfolgt. In meinem Suchdialog gibt es 3 Textfelder, in die etwas eingegeben werden kann, und die dann die Ausgabeliste filtern sollen. Angefangen hatte ich mit einer JList als Ausgabeliste, werde das nun aber auf JTable umbauen. Auf die Texteingabefelder will ich einen DocumentListener legen, der erkennt, wenn es dort eine Änderung gibt und aus der ursprünglichen ArrayList dann die Daten filtert, eine neue ArrayList zum Anzeigen erstellt, und diese dann der Ausgabeliste zuweist.

Viele Grüsse
Camino
 

MaikHSW

Aktives Mitglied
Hey.
Machst du das dann quasi Live in der Tabelle?
Also stets die Tabelle verändern und entsprechend einschränken?

Ich habe nun mal geschaut wie das geht.
Allerdings bin ich auf folgendes Problem gestossen:
Wie heisst denn der Listener der Comboboxen überwacht auf Eingaben?
Irgendwie komme ich da nicht so recht hinter.
DocumentListener scheint man nicht nehmen zu können.


Gruß
 

chuyx

Mitglied
müsste nen abgeleiteten listener geben.
spontan würde ich einfach den keylistener vermuten ;)
ansonsten inputxxxlistener ...

nach jeder tastatur eingabe, werden die angezeigten ergebnisse erweitert oder präzisiert.
klar könntest du als datenstruktur eine arraylist verwenden ... aber man kann sich auch einfach eine etwas intelligentere bauen ... ;) die buchstaben z.b. einzeln speichern ...d.h. alle namen mit a in einer, mit b und so weiter ... dann brauchst nicht immer alle komplett durchlaufen ;) ansonsten kannst die datenbank abfrage auch einfach nur einmal starten. nämlich genau dann, wenn der erste buchstabe eingegeben wurde. natürlich muss du den entsprechenden query anpassen, dass dir dann nur die namen mit dem anfangsbuchstaben x zurück geliefert werden.
 
Zuletzt bearbeitet:
C

Camino

Gast
Hey.
Machst du das dann quasi Live in der Tabelle?
Also stets die Tabelle verändern und entsprechend einschränken?
Na ja, wie gesagt, ich bin gerade noch dabei. Die Daten (also die ArrayList) liegen ja in einem TableModel, welches die JTable bei Änderungen aktualisert und die geänderten Daten anzeigt. Das müsste mit JList oder Comboboxen wohl dann auch über ein Model laufen.

Ich habe nun mal geschaut wie das geht.
Allerdings bin ich auf folgendes Problem gestossen:
Wie heisst denn der Listener der Comboboxen überwacht auf Eingaben?
Irgendwie komme ich da nicht so recht hinter.
DocumentListener scheint man nicht nehmen zu können.
Der DocumentListener ist ja auch für die JTextFields zuständig. Ich möchte halt die Ausgabeliste nach der Eingabe in die Textfelder filtern und aktualisieren. Also, ein 'M' in das Textfeld eingeben, und die Daten in der Ausgabeliste (bei mir JTable) sollen so gefiltert werden, dass nur noch die Daten mit Anfangsbuchstaben 'M' angezeigt werden. Bei mir kommt noch erschwerend dazu, dass ich drei Texteingabefelder habe, die bei der Filterung kombiniert werden. Für JTable gibt es wohl einen RowFilter, der das macht. Muss ich mir nochmal näher anschauen. Es gibt wohl aber auch einen FilterIterator, welcher dir die ArrayList filtern kann. Musst du mal googeln.

Viele Grüsse
Camino
 

MaikHSW

Aktives Mitglied
Hey.
Okay, das mit dem Modell habe ich noch lange nicht raus.
Ich habe es zwar mal gelesen bzw. gehört, aber noch nicht so durchdrungen.
Das kommt als nächstes auf meiner "Lernliste".
Ich danke euch erstmal für die ganzen Hinweise und Tipps, damit sollte ich schon deutlich weiter kommen.
Leider fehlt mir momentan die Zeit zur Umsetzung da die FH ihren Tribut fordert.
Aber sobald ich etwas mehr Luft habe werde ich mich da mal ransetzen.


Gruß
 

Ähnliche Java Themen

Neue Themen


Oben