JList filtern

V

vanny

Gast
Hi,

ich arbeite an einem Programm, wie´s jeder kennt, DB mit Kunden, Rechnungen, Bestellungen usw.
Nun möchte ich nicht zig Formulare für ""suche Kunde, Rechnung..." benutzen, sondern ein Eingabefeld für den Suchbegriff und fertig.
Diese Suchergebnisse landen dann alle in einer Liste, die in einer JList angezeigt werden.
Nun habe ich mir mittels JRadioButtons eine Schaltfläche erstellt, in der der User dann auswählen kann, welche Ergebnisse er in der JList sehen will. Ein banaler Filter halt.

Soweit so gut, es funktioniert auch alles.

Meine frage ist, ob man diese Filterfunktion irgendwie direkt an die JList/ListCellRenderer anknüpfen kann.
Zur Zeit lösche ich bei jedem FilterEvent die daten aus dem ListModel und füge sie dann gefiltert wieder hinzu.
Wäre glaube ich eleganter, wenn das Model die Daten behalten könnte und wirklich nur die Anzeige gefiltert wird.

Vielleicht hat ja jemand schon mal einen ähnlichen Ansatz verfolgt und kann mir nen Tipp geben.

Danke und Gruß Vanny
 
G

Gast2

Gast
Bei ner JList hast du imho keine Möglichkeit die Daten zu filtern. Anders ist das bei ner JTable, die kann von Haus aus Daten sortieren und auch filtern (RowFilter). Wenn du die Features nutzen willst könntest du vielleicht eine 1-spaltige JTable verwenden?
 

hdi

Top Contributor
Wäre glaube ich eleganter, wenn das Model die Daten behalten könnte und wirklich nur die Anzeige gefiltert wird.

Das Model ist die Anzeige. Du darfst dich da von dem Begriff nicht irritieren lassen. Ein ListModel heißt nur deshalb so, da es eine Mapping des internen Datenmodells auf die Liste ist. Aber es geht trotzdem nur um die Anzeige. (Der Renderer kümmert sich um das wie).

Zur Zeit lösche ich bei jedem FilterEvent die daten aus dem ListModel und füge sie dann gefiltert wieder hinzu.
Wenn du irgendwas löscht oder hinzufügst ist da schon was falsch. DefaultListModel? Hört sich nach redundanter Speicherung deines internen Datenmodells an. Dein Datenmodell sollte dir alle Infos liefern können die du brauchst. Je nach Filterung lieferst du unterschiedliche Ergebnisse. Da bietet sich das Delegate Pattern ganz gut an:

Java:
public class MyListModel extends DefaultListModel{

     private Data data; // dein (gesamter) interner Datenbestand

     private ListModel model; // Delegate

     public static final int FILTER_INVOICE = 1;
     public static final int FILTER_CUSTOMER = 2;

     public void setFilter(int filter){
         switch(filter){
              case FILTER_INVOICE:
                   model = new InvoiceListModel();
                   break;
              case FILTER_CUSTOMER:
                   model = new CustomerListModel();
                   break;
              }
         }
     }

     @Override
     public int getSize(){
         return model.getSize(); // Delegation
     }

     // analog zu den anderen ListModel-Methoden

     private class InvoiceListModel implements ListModel{
 
          @Override
          public int getSize(){
               return data.getInvoices().size();
          }

          // etc
     }

     private class CustomerListModel implements ListModel{
 
          @Override
          public int getSize(){
               return data.getCustomers().size();
          }

          // etc
     }
}

Du hast deine new
Code:
JList(new MyListModel())
, und das bleibt auch für die gesamte Laufzeit so. Über die setFilter-Methode kannst du die Anzeige durchschalten, und das ganz ohne dir irgendwelche Daten redundant abspeichern und dann irgendwie wieder löschen und neu zusammenbauen zu müssen etc.

edit: Das ganze geht auch noch etwas eleganter, zB kannst du das mit dem setFilter() besser lösen, und du musst auch nicht jedes mal eine neue Instanz des Invoice/CustomerModels erzeugen. Ist jetzt nur runtergeschrieben, aber ich denke die Idee kommt rüber.
 
Zuletzt bearbeitet:
V

vanny

Gast
setFilter muss ich sogar besser lösen ^^ weil man ja auch Kunden und Rechnungen zusammen listen kann^^

Der Ansatz is aber schon mal besser als meiner.

Gruß Vanny

//Edit: DefaultListModel?
Jain. Zum Testen Ja, hab aber schon ein eigenes in der Hinterhand es aber noch nicht implementiert, weil ich zZt. noch mit Datendummys arbeite.
 
Zuletzt bearbeitet von einem Moderator:
V

vanny

Gast
Ich hätte da noch eine Frage.

Ich habe für die Filterfunktion neben der groben Filterung nach DatenTyp auch Unterfilterungen.
(Bei Rechnungen zBsp. erstellt, versendet, bezahlt, gemahnt und storniert)
Zudem kommt noch, das ich eine Flag setzen möchte, wenn der selektierte Eintrag aus der Liste geöffnet wurde.(soll halt eine intuitive Bedienung werden)

Nun denke ich, dass da ein oder mehr Interfaces Sinn machen ;)
Wenn ich zBsp. ein Interface MyListItems habe, dieses dann bei Costumer und Invoice implementiere, dann hab ich mit diesem Verfahren ne Menge Methoden im Costumer, die ich dort eigentlich nicht brauche.
Denn den werd ich wohl kaum stornieren:autsch:..ergo iwie redundant.

Mag sein, dass es heute einfach schon wieder zu spät ist und ich deshalb nur auf dem Schlauch stehe aber wie bekomme ich das kombiniert, so dass die überflüssigen Methoden rausfliegen , ich aber die Abstraktion nicht verliere.

Gruß Vanny
 

hdi

Top Contributor
Hm, ich sehe da jetzt keinen Bedarf an Interfaces, sondern einfach an weiteren Implementierungen. So wie die o.g. Klassen InvoiceListModel und CustomerListModel, brauchst du halt noch PaidInvoiceListModel, SentInvoiceListModel, ... analog zu CustomerListModel. Gut, auf den ersten Blick vllt etwas lästig jetzt noch 10x ListModel zu implementieren.. Aber so ist es imho halt am besten. Du kannst so jederzeit neue Ansichten hinzufügen oder raushauen, und hast keine Abhängigkeiten zwischen den einzelnen Ansichten. Musst halt nur deine setFilter-Methode entsprechend anpassen. Mir fällt aber spontan keine bessere Idee ein.

Doof wird's, wenn du dann bezahlte UND versendete Rechungen anzeigen willst.. Das wird dann echt irgendwann zu krass mit den ListModels.. Aber was bleibt dir noch übrig? Kannst ansonsten nur irgenwelche Flags direkt in dein ListModel reinnehmen, und halt in den einzelnen Methoden wie getSize/getElement usw nur drauf switchen. ...Wobei, da war doch noch das Decorator Pattern. Wenn du solche Kombinationen vorhast, dann schau dir das mal an..

Zudem kommt noch, das ich eine Flag setzen möchte, wenn der selektierte Eintrag aus der Liste geöffnet wurde.(soll halt eine intuitive Bedienung werden)
Darunter kann ich mir grad nix vorstellen. Was für ein Flag? Wozu soll das genau dienen?
 
Zuletzt bearbeitet:
V

vanny

Gast
Darunter kann ich mir grad nix vorstellen. Was für ein Flag? Wozu soll das genau dienen?

Naja, wenn der User dann seine Rechnung mit Enter bestätigt, wird diese in ein entsprechendes Formular geladen und im eigentlichen Arbeitsbereich als Tab hinzugefügt.
Also benötige ich auch noch ein "active-flag", um zu verhindern, dass die Dinger mehrfach geöffnet werden und die Logik auf den Kopf stellen.
(Darstellung in der JList, Überwachung der Änderungen, Aktualisierung beim Schließen des Tabs usw.)

Das Decorator Pattern schau ich mir mal an.

//Edit:
Das Decorator Pattern kann eingesetzt werden, wenn:

... einzelnen Objekten zusätzliches Verhalten und zusätzliche Eigenschaften hinzugefügt werden sollen, ohne andere Objekte zu beeinflussen.
... das Verhalten und die Eigenschaften auch wieder entfernt werden sollen.
... die Bildung von Unterklassen zu einem zu komplexen und großen Klassenmodell führen würde.
... die Bildung von Unterklassen nicht möglich ist, da z.B. Klassen nicht sinnvoll abgeleitet werden können.
... die Implementation des zusätzlichen Verhaltens und der zusätzlichen Eigenschaften in der Ursprungsklasse zu komplex und zu oft zu überflüssigem Code führen würde.

Quelle

klingt nach mir :p

So looong Vanny
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JList Model filtern AWT, Swing, JavaFX & SWT 4
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
B Swing Dynamische JList mit Bildern AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
K Mehrfachselektierungen in einer JList AWT, Swing, JavaFX & SWT 6
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
E selektierter Datensatz in JList als String Datentyp AWT, Swing, JavaFX & SWT 23
E selektiertes Element aus JList zurückgeben AWT, Swing, JavaFX & SWT 7
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
L SQL & Jtable o. JList AWT, Swing, JavaFX & SWT 5
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
B JList -> Disabled AWT, Swing, JavaFX & SWT 6
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
I Jlist isselectionEmpty AWT, Swing, JavaFX & SWT 4
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
E Jlist nur mit Klasse? AWT, Swing, JavaFX & SWT 5
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D JList items voneinander trennen AWT, Swing, JavaFX & SWT 10
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6
T JList und Objekte AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
GianaSisters jList nur einmal ein Element anklicken AWT, Swing, JavaFX & SWT 3
TheWhiteShadow JList-Inhalt nach Änderung weg AWT, Swing, JavaFX & SWT 3
T JList ruft getElementAt nicht mehr auf AWT, Swing, JavaFX & SWT 4
B JList transparenter Hintergrund AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben