# Filterzeile im JTableHeader



## Nimbus (1. Apr 2008)

Hallo,

leider habe ich trotz intensiven Suchens kein Beispielcode-Fetzchen für mein Problem gefunden. Also: ich möchte eigentlich nichts ungewöhnliches, sondern schlichtweg die Spalten-Header erweitern durch ein JTextField als Filterzeile, in der der Benutzer Filtereingaben tätigen kann und das zwischen eigentlichem Header und den Tabellendaten erscheinen soll. Soweit klappt das zumindest schonmal. Allerdings kann ich in dem Filterfeld keine Eingaben machen (auch nicht mit "setEditable(true)".

Was fehlt hier noch (mal abgesehen von Listenern und Filtermethoden, das ist schon klar)? Wie mache ich das Feld editierbar? Reicht es dann, einfach einen Listener auf das Textfeld zu setzen?

Im folgenden mal ein kurzer Beispielcode. Vielen Dank im voraus für Tipps!

Gruss,
Nimbus


```
// PanelHeader.java

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;

class myRenderer extends JPanel implements TableCellRenderer {
	private static JLabel l1 = new JLabel("Eins");
	private static JTextField tf = new JTextField();
	public myRenderer() {
		setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
		l1.setAlignmentX(Component.CENTER_ALIGNMENT);
		add(l1);
		tf.setEditable(true);
		tf.setBackground(new Color(255,200,200));
		add(tf);
	}
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		// to be done		
		return this;
	}
}

public class PanelHeader extends JFrame {

	private static JFrame frame = new JFrame("PanelHeader Test 2");
	private static Container contentpane;
	private static DefaultTableModel dtm = new DefaultTableModel(5,10);
	private static JTable table = new JTable(dtm);
	private static TableColumnModel model = table.getColumnModel();
	private static JScrollPane scrollPane = new JScrollPane(table);
	private static JTableHeader jth = new JTableHeader();
	private static TableColumn tc = new TableColumn();	
	private static myRenderer newRend = new myRenderer();

	private static void changeHeader(int idx) {		
		tc = model.getColumn(idx);
		tc.setHeaderRenderer(newRend);
	}

	public static void main (String args[]) {

		contentpane = frame.getContentPane();
		contentpane.setLayout(new BorderLayout());
		contentpane.add(scrollPane,BorderLayout.CENTER);

		changeHeader(2);

		frame.setPreferredSize(new Dimension(500,300));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
		
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			}
		});
	}
}
```


----------



## Gast (1. Apr 2008)

Tut mir leid, genau das hab ich heute bei google gesehen kann mich aber nicht mehr an die URL erinnern. Habe auch nach Jtable und sortieren oder filtern gegoogelt.


----------



## Michael... (1. Apr 2008)

Hallo,

ein Renderer ist eigentlich nur für die Darstellung einer Komponente gedacht und stellt somit keine Funktionalitäten zur Verfügung, hierzu dient dann der Editor. Allerding wüsste ich jetzt nicht, dass man einem TableHeader auch einen Editor zuweisen kann.


----------



## abollm (1. Apr 2008)

Ich habe mir deinen Code nicht angesehen, aber würde es nihct reichen, einfach JText-Felder oberhalb der JTable zu platzieren und diese mit überschriebenen Methoden (z.B. columnMarginChanged) zu koppeln?

Dann hättest du aber den Nachteil, dass die JText-Felder entweder oberhalb oder unterhalb der Tabelle sind.


----------



## Nimbus (2. Apr 2008)

Hallo,

erstmal danke für die Antworten. BIn leider gerade krank geworden, deshalb erst jetzt die Antwort.

@Gast: in der Art war meine Suchanfrage auch, man findet zwar zig Seiten, aber irgendwie nicht das was ich suchte...naja, weiter suchen eben :-/

@Michael: danke, das könnte aber schonmal ein Hinweis sein. Ich werde mal suchen in Zusammehang mit TableCellEditors, vielleicht liegt hier der Hund begraben!

@Abollm: du hast den Grund schon genannt  - will sagen: ja, ich wollte eben gerade nicht die Filterzeilen ausserhalb der Tabelle haben, sondern jeweils zwischen Spaltenüberschrift und Spalteninhalt.

Nimbus


----------



## Michael... (2. Apr 2008)

vielleicht hilft Dir ja das Beispiel weiter. Hier wird ein eigner Header erzeugt, indem JTableHeader erweitert wird.


----------

