JTable Tabellenzelle erst bei 2. Klick editierbar

Moltar

Mitglied
Hallo,

ich habe ein JFrame mit einer JTable. In der ersten Spalte der Tabelle stehen einfache Texte, soweit alles kein Problem. Die zweite Spalte wird mit JComboBox dargestellt und editiert, da ich hier nur einige vorgegebene Werte zur Auswahl stellen möchte.

Wenn ich nun auf ein Feld aus der 2. Spalte klicke und der aktuelle Fokus nicht auf derselben Zeile ist, muss ich ein zweites mal auf das Feld klicken, damit die JComboBox geöffnet wird. Schön wäre aber, wenn gleich beim ersten Klick die Liste mit den Auswahlmöglichkeiten angezeigt wird.

Würde mich über jeden Hinweis freuen.

Hier noch mein Zelleditor:

Code:
private class ComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
		private static final long serialVersionUID = 1L;
		private JComboBox component = new JComboBox(new String[] {"Auswahl A", "Auswahl B"});

		public Component getTableCellEditorComponent(JTable tab, Object value, boolean isSelected, int row, int col) {
			component.setSelectedItem((String)value);
			return component;
		}

		public Object getCellEditorValue() {
			return component.getSelectedItem();
		}
	}
 
Hallo zusammen,

ich versuche mich mal gleich mit meinem ersten Posting nützlich zu machen :) .

Also ich habe das mal gerade flux ausprobiert und bei mir springt die Combobox direkt auf. Egal was vorher den Fokus besaß. Dabei habe ich die JTable wie folgt definiert:

Code:
            jTable = new JTable(5,4) {
                
                
                public TableCellEditor getCellEditor(int row, int col) {
                    switch (col) {
                    case 1:
                        return new ComboBoxEditor();    
                            
                    default: 
                        return super.getCellEditor(row, col);
                    }
                    
                }
            };

Vielleicht liegt es daran wie Du den CellEditor einbindest. Ein größerer Ausschnitt aus Deiner JTable - Klasse wäre interessant.
 
Hallo inter,

danke erstmal für die schnelle Hilfe. Hier mein Konstrukt, mit dem ich die Tabelle anlege:

Code:
public void createTable() {
DefaultTableModel tableModel = new DefaultTableModel(data, colHeads);
			table = new JTable(tableModel);
			table.getColumn("Typ").setCellRenderer(new ComboBoxRenderer());
			table.getColumn("Typ").setCellEditor(new ComboBoxEditor());
}

data ist ein String[][], der die Daten bereithält. colHeads ist String[] mit den Spaltennamen. Spalte 2 hat den Namen "Typ". Die Variable table ist in der Klasse bekannt durch:
Code:
private JTable table = null;

In deinem Code überschreibst du die getCellEditor-Methode. Muss ich das machen, wenn ich einen eigenen Zelleditor benutzen will?

Moltar
 
[...]
In deinem Code überschreibst du die getCellEditor-Methode. Muss ich das machen, wenn ich einen eigenen Zelleditor benutzen will?
[..]

Ne, "musst" Du nicht, aber das meinte ich mit "wie Du den CellEditor einbindest". Vielleicht würde der andere Weg schon Dein Problem lösen.

Eine Möglichkeit, wieso das bei mir funktioniert, könnte das Betriebssystem sein. Ich habe es unter WinXP ausprobiert. Ich könnte mir vorstellen, dass andere Window Manager (z.B. unter Linux) die Messages zwischen den Fensterkomponenten anders verteilen. Dass der Klick also nicht bis zur ComboBox durchgereicht wird. Fall das bei Dir der Fall ist, müsste man wohl tatsächlich ein häßliches Workaround mit einem Listener basteln.
 
Hallo,

es lag tatsächlich an der getCellEditor-Methode. Ich hab das bei mir jetzt analog zu deinem Codebeispiel eingebaut und es funktioniert :)

Vielen vielen Dank!

Ich habe zur Darstellung einen eigenen CellRenderer definiert, damit die Zelle immer als JComboBox angezeigt wird. Sollte ich analog die getCellRenderer(int, int) überschreiben? Bisher sind bei der Darstellung zwar noch keine Probleme aufgetreten, aber was nicht ist ....

Nur noch zur Info: Ich verwende das Programm unter Win2000.
 
Zuletzt bearbeitet:
Super, freut mich, dass es funktioniert. Also ich würde der Ordnung halber den CellRenderer auch so einbinden, aber das ist Geschmackssache. Der Unterschied ist zwar nicht fühlbar, aber vielleicht interessant, wenn Dein Projekt mal größere Ausmaße annimmt. Bei Deiner Methode werden CellRenderer und CellEditor erst zur Laufzeit, d.h. jedes Mal wenn Du dein Programm startest an dem Table-Objekt angemeldet. Das ist theoretisch langsamer.
 
Hallo,

so, ich habe jetzt den Editor und den Renderer wie in deinem Beispiel eingebaut. Da ich noch mehr Tabellen in der Art brauche, hab ich mal eine eigene Klasse draus gemacht.

Danke nochmal für die schnelle und kompetente Hilfe.

Grüße Moltar
 
Zurück