Swing RowFilter

Curry

Aktives Mitglied
Moin Moin!

Ich zeige eine Tabelle mit mehreren Spalten an. Jetzt möchte ich die Datensätze dieser Tabelle filtern und dabei mehrere Spalten berücksichtigen. Nach einer Spalte kann ich mit dem folgenden Code bereits filtern:
Java:
RowFilter<Object, Object> rf = null;
			try {
				rf = RowFilter.regexFilter(this.model.getName(), 1);
			} catch (java.util.regex.PatternSyntaxException e) {
				return;
			}
			sorter.setRowFilter(rf);

Aber jetzt würde ich gerne gleichzeitig nach einer weiteren Spalte filtern können. Doch der Code funktioniert nicht. Man darf wohl nur einen RowFilter zu einem Sorter hinzufügen. Aber wie setze ich es dann um?
Java:
RowFilter<Object, Object> rf_1 = null;
			RowFilter<Object, Object> rf_2 = null;
			try {
				rf_1 = RowFilter.regexFilter(this.model.getFilterName(), 1);
				rf_2 = RowFilter.regexFilter(this.model.getFilterVorname(), 2);
				
				sorter.setRowFilter( rf_2 );
				sorter.setRowFilter( rf_1 );
			} catch (java.util.regex.PatternSyntaxException e) {
				return;
			}

Würde mich sehr über eure Hilfe freuen!
 

eRaaaa

Top Contributor
Mit einem andFilter!
Adde also deine beiden RowFilters in eine Liste oder besser gesagt in irgendetwas was (Iterable<? extends RowFilter<? super M,? super I>) ist und rufe dann
Code:
RowFilter.andFilter(liste);
auf, was dir dann einen RowFilter zurück gibt den du wie in deinem Beispielcode bei setRowFilter benutzen kannst.
Code:
			final List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(2);
			filters.add(RowFilter.regexFilter(this.model.getFilterName(), 1));
			filters.add(RowFilter.regexFilter(this.model.getFilterVorname(), 2));
			final RowFilter<Object, Object> filter = RowFilter.andFilter(filters);
			sorter.setRowFilter(filter);
 

Curry

Aktives Mitglied
Ich hatte noch etwas anderes ausprobiert, von dem ich dachte, dass es auch funktionieren müsste. Aber diese Lösung produziert Fehlermeldungen über Fehlermeldungen.

Ohne die Angabe der Fehlermeldungen ist es vielleicht schwer zu Helfen, aber ich weiß nicht wie ich die alle aus Eclipse kopiert bekomme. Vielleicht erkennt ein Profi aber auch so das Grundproblem.

Noch zur Ergänzung: Die Klasse MyRowFilter ist eine lokale Klasse und die höhere Klasse hat eine eigenschaft ViewModel model die in der lokalen Klasse verfügbar sein soll.

Java:
public void update(Observable obs, Object obj) {
		if(obj == "filter") {
			/*
			try {
				final List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(2);
				filters.add(RowFilter.regexFilter(this.model.getFilterName(), 1));
				filters.add(RowFilter.regexFilter(this.model.getFilterVorname(), 2));
				final RowFilter<Object, Object> filter = RowFilter.andFilter(filters);
				sorter.setRowFilter(filter);
			} catch (java.util.regex.PatternSyntaxException e) {
				return;
			}
			*/
			
			MyRowFilter<Object, Object> myFilter = new MyRowFilter<Object, Object>(this.model);
			sorter.setRowFilter(myFilter);
		}
	}
	
	public class MyRowFilter<Object, Object>(ViewModel model) extends RowFilter<Object, Object> {
		
		private ViewModel model;
		
		public MyRowFilter<Object, Object>(ViewModel model) {
			this.model = model;
		}
		
		public boolean include(Entry<? extends Object, ? extends Object> entry) {
		
			if(entry.getValue(1).toString() == this.model.getFilterName() && entry.getValue(2).toString() == this.model.getFilterVorname()) {
				return true;
			}
		/*for (int i = entry.getValueCount() - 1; i >= 0; i--) {
			System.out.println( entry.getValue(i).toString() );
			System.out.println( entry.getValue(i).getClass().toString() );					       
		}*/
		return false;
		}
	}
 

Curry

Aktives Mitglied
So, ich habe die wichtigsten Fehlermeldungen mal abgetippt (copy & paste geht nicht ... die kommen erst beim hovern auf ein Symbol in der Zeilennummerleiste bei Eclipse).

Java:
public void update(Observable obs, Object obj) {
		if(obj == "filter") {
			/*
			try {
				final List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(2);
				filters.add(RowFilter.regexFilter(this.model.getFilterName(), 1));
				filters.add(RowFilter.regexFilter(this.model.getFilterVorname(), 2));
				filters.add(RowFilter.regexFilter(this.model.getFilterOrt(), 3));
				final RowFilter<Object, Object> filter = RowFilter.andFilter(filters);
				sorter.setRowFilter(filter);
			} catch (java.util.regex.PatternSyntaxException e) {
				return;
			}
			*/
			try {
				MyRowFilter<Object, Object> myFilter = new MyRowFilter<Object, Object>this.model);
				sorter.setRowFilter(myFilter);
			}
			catch (Exception ex) {
				ex.printStackTrace();
			}
			
		}
	}
	
	public class MyRowFilter<Object, Object> extends RowFilter {
		
		private ViewModel model;
		
		public MyRowFilter<Object, Object>(ViewModel model) {
			this.model = model;
		}
		
		public boolean include(Entry<? extends Object, ? extends Object> entry) {
		
			if(entry.getValue(1).toString().equals(this.model.getFilterName()) && entry.getValue(2).toString().equals(this.model.getFilterVorname())) {
				return true;
			}
		/*
		for (int i = entry.getValueCount() - 1; i >= 0; i--) {
			System.out.println( entry.getValue(i).toString() );
			System.out.println( entry.getValue(i).getClass().toString() );					       
		}*/
		return false;
		}
	}

Zeile 16:
- MyRowFilter is not generic; it cannot be parameterized with arguments <Object, Object>

Zeile 17:
- Type safty, the expression of type MyRowFilter<Object,Object> needs unchecked converstion to RowFilter<? super TableModel,? super Integer>

Zeile 26:
- The type parameter Object is hiding the type Object
- RowFilter is raw type. Reference to generic type Row Filter<M,I> should be parameterized
- Duplicate type parameter Object
- Type MyRowFilter<Object,Object> must implement the inherited abstract method RowFilter,include(RowEntry.Entry)

Zeile 34:
- Name clash: The method include(RowFilter.Entry<? extends Object,? extends>) of type MyRowFilter<Object, Object> has the same erasure as include(RowFilter.Entry) of type RowFilter but does not override it
 

eRaaaa

Top Contributor
Ahh okay, ist gar keine Exception, okay. Joah deine generische Klasse sieht etwas merkwürdig aus(hatte ich vorher gar nicht gesehen), was hast du da genau vor?
a) sehe ich da spontan den Grund nicht wieso das eine generische Klasse ist
b) wendest du das etwas falsch an - :rtfm: generische Datentypen
c) if(obj == "filter") { --> lese noch einmal den letzten Satz meines letzten Posts *g*

Also wie gesagt, ka was das werden soll, du könntest auch einfach General Filter erweitern
Code:
public class MyRowFilter extends GeneralFilter )
so wie es z.B. auch der RegexFilter macht oder was du evtl. meintest war
Code:
public class MyRowFilter extends RowFilter<Object, Object>

Der Konstruktor mit
Code:
public MyRowFilter[B]<Object, Object>[/B](ViewModel model)
ist jedenfalls bei beiden Varianten falsch :p ->
Code:
public MyRowFilter(ViewModel model)
und Zeile 16 natürlich dann nicht generisch umschreiben :)
 

Curry

Aktives Mitglied
Vielen Dank für deine Geduld! :)

Ah okay, ich hatte mich da etwas mit den <Object, Object> verzettelt. Ich wollte die Klasse gar nicht generisch erstellen, ich dachte nur dass es so sein müsse, da ich sie von einer generischen Klasse (RowFilter<Object,Object>) ableite.

Jetzt gibt es nun keine Fehlermeldung mehr, aber funktionieren tut es noch nicht so ganz. Das Problem ist, dass das Programm keine Zeile der Tabelle mehr anzeigt, egal was ich in eins der Textfelder meines Filterformulars eingabe. Es kann natürlich sein, dass man nur in einen der drei Felder etwas eingibt und die anderen beiden FilterStrings leer sind also z.B. model.filter_title = "" was durch die Methode model.getFilterTitle() zurückgegeben wird.

Im Prinzip reicht derzeit auch der auskommentierte Code in der Methode "update()" für meine Zwecke. Aber es ist noch etwas unschön, da Groß- und Kleinschreibung so beachtet wird. Des Weiteren würde ich gerne lernen einen eigenen Filter zu schreibe, falls ich später vielleicht mal eine irgendwie geartete Filterung umsetzen möchte.

Jetzt schaut der Code so aus:
Java:
public void update(Observable obs, Object obj) {
		if(obj.equals("filter")) {
			/*
			try {
				final List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(2);
				filters.add(RowFilter.regexFilter(this.model.getFilterTitle(), 1));
				filters.add(RowFilter.regexFilter(this.model.getFilterAuthorFirst(), 2));
				filters.add(RowFilter.regexFilter(this.model.getFilterAuthorSenior(), 3));
				final RowFilter<Object, Object> filter = RowFilter.andFilter(filters);
				sorter.setRowFilter(filter);
			} catch (java.util.regex.PatternSyntaxException e) {
				return;
			}
			*/
			
			try {
				MyRowFilter myFilter = new MyRowFilter(this.model);
				sorter.setRowFilter(myFilter);
			}
			catch (Exception ex) {
				ex.printStackTrace();
			}
			
		}
	}
	
	public class MyRowFilter extends RowFilter<Object,Object> {
		
		private ViewModel model;
		
		public MyRowFilter(ViewModel model) {
			this.model = model;
		}
		
		
		
		public boolean include(Entry<? extends Object, ? extends Object> entry) {
			if 	(	
					entry.getValue(1).toString().toLowerCase().matches( this.model.getFilterTitle().toLowerCase() ) &&
					entry.getValue(2).toString().toLowerCase().matches( this.model.getFilterAuthorFirst().toLowerCase() ) &&
					entry.getValue(3).toString().toLowerCase().matches( this.model.getFilterAuthorSenior().toLowerCase() )
				) 
			{
				return true;
			}
		return false;
		}
	}
 

Ähnliche Java Themen


Oben