JComboBox in JTable: Bei editieren den richtigen Eintrag anwählen

mas666

Mitglied
Hallo zusammen,

Ich habe eine JTable in derer erster Spalte ein String dargestellt wird, der einen Eintrag aus einer JComboBox repräsentiert. Wenn ich die entsprechende Zelle anklicke, wird die JComboBox angezeigt und ich kann einen Eintrag wählen.

So weit so gut.

Nun hätte ich es aber gerne, dass, wenn eine solche Zelle angewählt wird, automatisch der bisher gewählte Eintrag in der JComboBox angewählt ist.

Meine Tabelle erbt von JTable, der Editor für die JComboBox ist der DefaultEditor, das Model erbt von AbstractTableModel und ist selber implementiert.

Irgendwie bekomme ich das nicht hin. Hat mir jemand einen Typ?

Danke im Voraus, Gruss
mas
 
Hey vfl_freak, danke für Deine Antwort, here you go:

Im JPanel wo die Tabelle angezeigt wird, setze ich den Editor für die entsprechende Spalte.

Java:
table.getColumnModel().getColumn(KeypadConstants.COLUMN___TYPE).setCellEditor(new CustomComboBoxCellEditor(KeypadConstants.KE_COM_TYP));
Natürlich wird hier die ganze JTable noch "konfiguriert" Model wird gesetzt, Listeners und Renderer hinzugefügt, usw.

Der Editor ist (nicht wie vorhin geschwindelt) angepasst, die Anpassungen sind jedoch minim, ergo unwichtig.

Die Klasse CustomComboBoxCellEditor:
Java:
import java.awt.event.MouseEvent;
import java.util.EventObject;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;

public class CustomComboBoxCellEditor extends DefaultCellEditor {

	public CustomComboBoxCellEditor(JComboBox obj) {
		super(obj);
	}
	
	@Override
	public boolean isCellEditable(EventObject evt) {
        if (evt instanceof MouseEvent) {
            int clickCount;

            // For single-click activation
            //clickCount = 1;

            // For double-click activation
            clickCount = 2;

            // For triple-click activation
            //clickCount = 3;

            return ((MouseEvent)evt).getClickCount() >= clickCount;
        }
        return true;
    }
}

Dann wird mit der Methode setValueAt in meinem TableModel der neue Wert gesetzt. (Auszug aus der Methode)

Java:
	@Override
	public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
		final KeypadEntry keypadEntry = keypad.getLine( rowIndex );
		
		switch( columnIndex ){
		case KeypadConstants.COLUMN___TYPE: 	// TYP
			final KeypadType newType = (KeypadType)aValue;
			keypadEntry.setType( newType );
			break;
		}
		fireTableCellUpdated(rowIndex, columnIndex);
	}

Was mir fehlt, ist der Schritt dazwischen. Im Moment, wo die Zelle in den "Editier-Modus" geht, müsste ich den entsprechenden index der JComboBox anwählen.

Danke für jeden Tipp, Gruss
mas
 
Moin,

ich fürchte, ich verstehe jetzt die Frage nicht so ganz ....

Nun hätte ich es aber gerne, dass, wenn eine solche Zelle angewählt wird, automatisch der bisher gewählte Eintrag in der JComboBox angewählt ist.

Meinst Du, schon dann, wenn Du nur auf die Zeile klickst oder erst wenn Du (beim Doppeklick?) die ComboBox öffnest? :confused:

Eigentlich sollte es doch reichen, dies beim Öffnen zu tun, oder ?

Gruß
Klaus
 
Also ich habe folgendes Problem:
- Ich Klicke die Zelle an (Doppelklick)
- Der Dropdown öffnet sich.
- Kein Eintrag ist angewählt

Was ich möchte:
- Ich Klicke die Zelle an (Doppelklick)
- Der Dropdown öffnet sich.
- Der zuvor selektierte Eintrag ist angewählt

Ich vermute es funktiniert nicht, weil:
- Der Dropdown in jeder Zeile der Tabelle verfügbar ist?
- Die comboBox als Singleton implementiert ist?
- Die Elemente der ComboBox Objekte sind, der dargestellte Wert aber ein String?

Was ich suche:
- Einen Listener oder etwas ähnliches, das ausgelöst wird, wenn ich beginne zu editieren (Also just bevor die ComboBox sich öffnet), um den gewählten Eintrag zu setzen.

Ich hoffe, das macht das Problem klar.

Gruss
mas
 
Moin,
Was ich möchte:
- Ich Klicke die Zelle an (Doppelklick)
- Der Dropdown öffnet sich.
- Der zuvor selektierte Eintrag ist angewählt
ok, so wie ich es auch vermutet hatte .... ;)

Ich vermute es funktiniert nicht, weil:
- Der Dropdown in jeder Zeile der Tabelle verfügbar ist?
- Die comboBox als Singleton implementiert ist?
- Die Elemente der ComboBox Objekte sind, der dargestellte Wert aber ein String?
Was heißt "der Dropdowm ist in JEDER Zelle verfügbar"?
Ich denke, nur in der ersten ..... :confused:
Das es am Singleton liegt, glaub ich eher weniger, der verhindert ja nur, dass von einer Klasse mehr als ein Objekt erzeugt werden kann. Oder versuchst Du etwa jedesmal eine neue ComboBox zu erzeugen ? :eek:


Was ich suche:
- Einen Listener oder etwas ähnliches, das ausgelöst wird, wenn ich beginne zu editieren (Also just bevor die ComboBox sich öffnet), um den gewählten Eintrag zu setzen.
Ist mir nicht bekannt! Es gibt aber doch für die ComboBox den einfachen Befehl "setSelectedIndex", dem Du nur eine Integer für den gewünschten Index mitgeben musst!

Ich würde einfach an der Stelle, wo Du den Doppelklick prüfst, hier entsprechend dem String in der ersten Spalte über eine Zuordnung den gewünschten Index zu übergeben!

Gruß
Klaus
 
vfl_freak hat gesagt.:
Was heißt "der Dropdowm ist in JEDER Zelle verfügbar"?
Ich denke, nur in der ersten ..... :confused:

In jeder ZEILE, nicht in jeder Zelle.

vfl_freak hat gesagt.:
Ist mir nicht bekannt! Es gibt aber doch für die ComboBox den einfachen Befehl "setSelectedIndex", dem Du nur eine Integer für den gewünschten Index mitgeben musst!

Genau! Aber WO, mache ich das? Das war von beginn weg meine Frage. WIE fange ich das Ereignis ab: "Jetzt wird diese Tabellenzelle bearbeitet"?


vfl_freak hat gesagt.:
Ich würde einfach an der Stelle, wo Du den Doppelklick prüfst, hier entsprechend dem String in der ersten Spalte über eine Zuordnung den gewünschten Index zu übergeben!

Keine schlechte Idee. Ich schaus mir an, danke!

Gruss
mas
 
Zurück