# Combobox als Filterkriterium (Gruppierung) in JTable



## JavaTryOut (13. Okt 2009)

Hallo,

ich möchte nachfolgendes Tabellen-Layout in Java nachbasteln:







Die Spaltenbeschriftung ist jeweils der Spaltenname aus der Datenbank. Klickt man auf den Pfeil nach unten, erscheint eine Combobox mit gruppierten Werten, d. h. jeder Wert aus der Spalte erscheint nur einmal. Wird nun ein Wert ausgewählt, soll die ganze Spalte danach gruppiert werden. Zusätzlich soll z. B. ein Eintrag "Custom ..." ein Fenster öffnen und die Möglichkeit bieten, einen String einzugeben nachdem die Tabelle bzw. die Spalte gefiltert wird.

Nun zu den Fragen:
Wie bekomme ich die Spaltenbeschriftung als Combobox und die "gruppierten" Werte aus der betroffenen Spalte da rein?

Die Daten kommen aus einer DB. Hat schon mal jemand sowas nachgebaut und diesbezüglich Erfahrungen gemacht? Mir stellt sich die Frage, wie ich so etwas umsetzen soll und wie performant die jeweiligen Möglichkeiten sind. Abhängig von der Gruppierung sollen sehr viele Daten angezeigt werden. Ist es besser nach jeder Gruppierung die DB abzufragen oder RowFilter zu benutzen?
Kennt jemand Tutorials, Codeschnipsel oder ähnliches, das mir bei dieser Aufgabe weiterhelfen könnte?

Schon mal vielen Dank!


----------



## Kaffeebohn (13. Okt 2009)

Hallo JavaTryOut,

ich habe zwar nicht das selbe, aber etwas ähnliches bereits versucht. Ich wollte allerdings keine ComboBox in der Tabelle haben, sondern eine JProgressBar. Ich habe das grob wie folgt gelöst:

einen entsprechenden Renderer geschrieben für die Tabellenspalte:


```
public class ProgressBarRenderer implements TableCellRenderer
{	
	public ProgressBarRenderer() { 
		super();
	}
	
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
	{
		JProgressBar jbar = (JProgressBar)value;

		return jbar;  
	}
}
```

Einen solchen instantiiert und wie folgt der Tabelle hinzugefügt:


```
table.setModel(model);
model.addColumn("Status");
table.getColumn("Status").setCellRenderer(statusRenderer);
```

Wenn du nun deiner Tabelle eine Zeile hinzufügst:


```
model.insertRow(0, new Object[] {deineProgressBar});
```

Vielleicht hilft dir das ein wenig weiter und du kannst es an deine Umstände anpassen!

Liebe Grüße


----------



## Michael... (13. Okt 2009)

Ich habe mal den AutoFilter aus MS Excel2003 mit Java 1.4 nachgebaut (also noch vor RowSorter, Filter und solchen Schnickschnack) - nehme mal an daraufhin solls rauslaufen?!? Allerdings kenne ich Deine Programmier/Java - Erfahrung nicht, und da das ganze recht komplex ist, würde ich erst mal schauen ob es nicht aussreichend ist neben der Tabelle Felder zum Filtern anzulegen und die Filterung direkt in der Datenbank zu machen.
Da der Header bei JTable m.W nur einen Renderer aber keinen Editor besitzt, kannst Du den Header zwar aussehenlassen, als sei er eine ComboBox, aber eben nicht bedienen. Bei meinem damaligen Projekt habe ich einfach bei Mouseclick in einem bestimmten Bereich des Headers ein Popup mit einer entsprechenden Liste aufpoppen lassen. Das mit dem benutzerdefinierten Filtern war etwas komplexer. Habe die Benutzereingabe in ein RegEx transformiert und dann je nach dem ob die Ausdruck negiert mit UND oder ODER verknüpft waren entsprechende Einträge aus der Tabelle rausgeschmissen oder eben dringelassen.


----------



## JavaTryOut (13. Okt 2009)

Hallo,

schon mal vielen Dank für die Antworten!

@Michael...
Also im Grunde ist das so wie in Excel, stimmt! Das der Header dann keine Combo ist, damit kann ich Leben. Die Filter neben der Tabelle sind nicht so schön und unkomfortabel. 
Ich hab noch die Idee, dass über die Header der Tabelle die Daten direkt sortiert werden können (ist ja bei jXTable autom. dabei) und die Combos in die erste Zeile zu platzieren. Dann stellt sich nur noch die Frage, ob die Filter wie bei deinem Vorschlag über die DB laufen oder über ein RowFilter? Am einfachsten wäre wirklich die Filter über die DB zu machen, aber wie "flüssig" kann man damit arbeiten? Meine Zweifel liegen bei der "Abfrage"-Geschwindigkeit Anwendung-DB. Wenn das bei 100.000 Daten oder mehr kein Problem darstellt, spricht eigentlich nichts dagegen. 
Achja, meine Programmiererfahrung ... bin kein Profi und kein Anfänger. Wenn´s komplex wird knie ich mich auch tiefer rein ;-)


@Kaffeebohn
... du hast das mal versucht? Ist es dann möglich bzw. praktikabel? 
Repräsentiert der CellRenderer aus dem Code die erste Zeile mit den ProgressBars? Wenn ja, dann könnte ich diese durch Combos ersetzen und darüber die Daten filtern lassen ... !?

Gruß


----------



## Michael... (14. Okt 2009)

In folgendem Thread ging es mal darum die letzte Zeile einer Tabelle trotz Filterung/ Sortierung stehen zu lassen:
http://www.java-forum.org/awt-swing-swt/89212-jtable-zeilen-sortieren-bestimmte-zeilen-fest-lassen.html#post564091
Das kann man sicherlich für die erste Zeile umstricken, dann kannst Du in diese eine ComboBox als Renderer und als Editor reinstecken.


----------



## Kaffeebohn (14. Okt 2009)

Ich habe das mal umgesetzt und es hat auch einwandfrei funktioniert. Habe im Anhang einen Screenshot von dem Endergebnis drangehängt damit du dir was drunter vorstellen kannst.

Falls dir das weiterhilft melde dich einfach.

Liebe Grüße


----------



## JavaTryOut (14. Okt 2009)

Hallo,

da kommen wir der Sache schon näher! Ich lass mich von beiden Vorschläge mal inspirieren und bastele daraus was. Wenn ich erfolgreich bin, poste ich hier meine Lösung. Kann sich aber etwas hinziehen, da ich die nächsten Tage viel unterwegs bin ...

Bin ja schon angetan, dass es hier so sachlich rundgeht! In anderen Foren wird man eher für das "Nichts-Können" belächelt und "nur" auf die API verwiesen ...

Vielen Dank für eure Hilfe!

Gruß


----------



## Kaffeebohn (14. Okt 2009)

Solange mir nichts besseres einfällt verweise ich auch gerne auf die API


----------

