# Bitte um Hilfe bei ComboBox in TableHeader



## Oli (4. Mrz 2009)

Hallo,

folgender Code macht ja schon fast das was ich will, ich bekomme eine Combobox im TableHeader angezeigt. Nur leider kann ich die nicht "aufklappen" und was auswählen. 
Kann mir jemand sagen woran das liegt?


```
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

public class ComboBoxImHeader extends JPanel {

	public ComboBoxImHeader() {
		setLayout(new BorderLayout());
		String[] headerStr = { "1", "2", "3" };

		DefaultTableModel dm = new DefaultTableModel(headerStr, 4);
		JTable table = new JTable(dm);

		ComboBoxHeaderRenderer renderer = new ComboBoxHeaderRenderer();
		TableColumnModel model = table.getColumnModel();
		int n = headerStr.length;
		for (int i = 0; i < n; i++) {
			model.getColumn(i).setHeaderRenderer(renderer);
		}

		JTableHeader header = table.getTableHeader();
		header.addMouseListener(new HeaderListener(header, renderer));
		JScrollPane pane = new JScrollPane(table);
		add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		JFrame f = new JFrame("Combobox im Header");
		f.getContentPane().add(new ComboBoxImHeader(), BorderLayout.CENTER);
		f.setVisible(true);
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		f.pack();
	}

	class HeaderListener extends MouseAdapter {
		JTableHeader header;

		ComboBoxHeaderRenderer renderer;

		HeaderListener(JTableHeader header, ComboBoxHeaderRenderer renderer) {
			this.header = header;
			this.renderer = renderer;
		}

		public void mousePressed(MouseEvent e) {
			int col = header.columnAtPoint(e.getPoint());
			renderer.setPressedColumn(col);
			header.repaint();

			System.out.println("Column: " + col);
		}

		public void mouseReleased(MouseEvent e) {
			int col = header.columnAtPoint(e.getPoint());
			renderer.setPressedColumn(-1);
			header.repaint();
		}
	}

	class ComboBoxHeaderRenderer extends JComboBox implements TableCellRenderer {
		int pushedColumn;

		public ComboBoxHeaderRenderer() {
			pushedColumn = -1;
		}

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
			addItem("1");
			addItem("2");
			addItem("3");
			addItem("4");
			addItem("5");
			addItem("6");
			return this;
		}

		public void setPressedColumn(int col) {
			pushedColumn = col;
		}
	}
}
```

Vielen Dank,

Oli


----------



## Ebenius (4. Mrz 2009)

Der JTableHeader benutzt Deinen TableCell*Renderer* der -- wie der Name schon sagt -- nur darstellt. Die Comobox-Komponente wird nicht lebendig sondern nur per CellRendererPane gezeichnet.

Ebenius


----------



## Oli (4. Mrz 2009)

Hm,

Vielen Dank. Aber wie kann ich denn dann meine ComboBoxen zum Leben erwecken?

Grüße Oli


----------



## Ebenius (4. Mrz 2009)

Du kannst Dir den CellEditor-Mechanismus aus der JTable angucken und für den JTableHeader (eine Ableitung dessen) nachbauen. So würde ich es zumindest tun. Einfach wird das aber nicht. Beachte, dass der Spaltenkopf verschiebbar bleiben muss.

Ebenius


----------



## Gast2 (4. Mrz 2009)

> Beachte, dass der Spaltenkopf verschiebbar bleiben muss



Warum muss??


----------



## Ebenius (4. Mrz 2009)

JTableHeader unterstützt doch das Verschieben von Spalten. Diese Funktionalität will man ja normaler Weise behalten. Diesen Punkt gibt es also zu beachten. Mehr wollte ich nicht sagen.

Ebenius


----------



## thE_29 (4. Mrz 2009)

Muss er nicht 
JTable.getTableHeader().setReorderingAllowed(false);


----------



## Ebenius (4. Mrz 2009)

Ist mir bekannt. Sollte man aber.


----------



## thE_29 (4. Mrz 2009)

Najo, wer verschiebt die bitte?
Ich deakvtiviere das immer, da es für mich eigentlich noch nie einen Sinn ergeben hat, die Spalten zu verschieben..


----------



## Ebenius (4. Mrz 2009)

Bei unseren Tabellen ist es immer eingeschaltet. Ist sicher Geschmackssache und hängt bestimmt von der Art der dargestellten Daten ab, oder?

Ebenius


----------

