JCombobox in JTable

Status
Nicht offen für weitere Antworten.

dnaxx

Mitglied
Hallo!

Ich finde irgendwie keine Lösung für folgendes Problem. Ich fülle eine Tabelle mit verschiedenen Daten (von verschiedenen Datentyp), wobei im Vorhinein nicht bekannt ist, welche Daten wo stehen werden. Anhand des Datentyps wird ein entsprechender Renderer für die Tabellenzelle gewählt (also z.B. JCheckBox für Boolean).
Jetzt gibt es einen Datentyp "ComboBoxValues" indem Einträge stehen, die in einem Combobox renderer dargestellt werden sollen. Die Definition eines einfachen Combobox Editors/Renderers ist ziemlich einfach, wenn die Einträge für jede Combobox Zelle gleich sind. Bei mir sind die Einträge jedoch von Zelle zu Zelle unterschiedlich.
Hat jemand eine Ahnung, wie man sowas gescheit machen kann?

Danke und Grüße,

P.S: hier noch etwas Code (Ausschnitte bzw. vereinfacht):
Editor:
Code:
public class TestCellEditor extends AbstractCellEditor implements TableCellEditor {
	private Map<String,TableCellEditor> editors = new HashMap<String,TableCellEditor>();
	private TableCellEditor editor = new DefaultCellEditor(new JTextField());

	public TestCellEditor() {
		super();
		editors.put(Boolean.class.getName(), new DefaultCellEditor(new JCheckBox()));
		editors.put(String.class.getName(), new DefaultCellEditor(new JTextField()));
		
		editors.put(ComboBoxValues.class.getName(), new DefaultCellEditor(new JComboBox()));
	}

	public Object getCellEditorValue() {
		return editor.getCellEditorValue();
	}

	public void addCellEditorListener(CellEditorListener l) {
		editor.addCellEditorListener(l);
	}
	
	public void removeCellEditorListener(CellEditorListener l) {
		editor.removeCellEditorListener(l);
	}
	
	public boolean stopCellEditing() {
		return editor.stopCellEditing();
	}

	public void cancelCellEditing() {
		editor.cancelCellEditing();
	}

	public Component getTableCellEditorComponent(JTable table,
			Object value, boolean isSelected, int row, int column) {
		comboVal = null;
		if (value instanceof Boolean) {
			editor = editors.get(Boolean.class.getName());
		}
		else if (value instanceof ComboBoxValues) {
			editor = editors.get(ComboBoxValues.class.getName());
		}
		//...
		else {
			editor = editors.get(String.class.getName());
		}
		
		return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
	}
}

Renderer:
Code:
public class TestCellRenderer extends DefaultTableCellRenderer {
	protected JComboBox comboBox = new JComboBox();
	public Component getTableCellRendererComponent(
			JTable table, Object value,
			boolean isSelected, boolean hasFocus,
			int row, int column) {
		if (value instanceof ComboBoxValues) {
			ComboBoxValues tmpo = (ComboBoxValues)value;
			for (Object s : tmpo.getEntries()) {
				comboBox.addItem(s);
			}
			return comboBox;
		}
		
		return super.getTableCellRendererComponent(
				table,value,isSelected,hasFocus,row,column);
	}
}
 
Sind die Einträge von Zelle zu Zelle oder von Spalte zu Spalte unterschiedlich?

Du kannst einen Editor auch einzelnen Tabellenspalte zuweisen.
 
die Einträge sind von Zelle zu Zelle unterschiedlich.
Ich habe jetzt doch noch eine Quick&Dirty Lösung gefunden. Und zwar leite ich ComboBoxValues einfach von JComboBox ab. Das ist nicht sehr schön, aber es funktioniert.
 
dnaxx hat gesagt.:
Hallo!

Ich finde irgendwie keine Lösung für folgendes Problem. Ich fülle eine Tabelle mit verschiedenen Daten (von verschiedenen Datentyp), wobei im Vorhinein nicht bekannt ist, welche Daten wo stehen werden. Anhand des Datentyps wird ein entsprechender Renderer für die Tabellenzelle gewählt (also z.B. JCheckBox für Boolean).
Jetzt gibt es einen Datentyp "ComboBoxValues" indem Einträge stehen, die in einem Combobox renderer dargestellt werden sollen. Die Definition eines einfachen Combobox Editors/Renderers ist ziemlich einfach, wenn die Einträge für jede Combobox Zelle gleich sind. Bei mir sind die Einträge jedoch von Zelle zu Zelle unterschiedlich.

Was genau heißt das: von Zelle zu Zelle?

Wirklich jede Zelle, oder jede Zelle pro Zeile, aber in jeder Zeile wieder identisch?
 
jede Zelle in der Tabelle kann einen beliebigen Datentyp und einen beliebigen Wert haben. Es gibt keine Regelmäßigkeiten.
 
Ich finde die herangehensweise etwas merkwürdig.

Der Renderer ist zur Darstellung des Tabellenfeldes gedacht. Eine Darstellung als Combobox ist im Prinzip nicht erforderlich, da ja normalerweise nur das aktuell ausgewählte Element angezeigt wird. Da der Editor beim Klick auf die Zelle aktiv wird, erkennt der Benutzer automatisch das Auswahlmöglichkeiten bestehen. Somit würde eigentlich ein einfacher Renderer reichen. Sollte trotzdem eine Combobox gewünscht sein, würde es reichen, diese mit dem ausgewählten Element des Combobox-Editors zu füllen.

Der Editor hingegen wird von dir überhaupt nicht mit Werten versehen. Von daher würde ich empfehlen damit mal anzufangen und den Renderer für die Zelle zunächst auf einfache Darstellung zu ändern.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben