# JTable mit JComboBox als Celleditor, selectedRow falsch!



## Guest (8. Dez 2007)

Hallo,

ich habe hier eine JTable, der ich eine JComboBox als Editor für eine Spalte mitgebe.
Der JComboBox habe einen ItemListener verpasst um auf das Wechseln des Wertes reagieren zu können.

Wenn ich nun auf die entsprechenden Zellen (mit der JComboBox) klicke und mir im ItemListener der JComboBox die selektierte Zeile ausgeben lasse, dann bekomme ich immer die vorherige Zeile, aber nicht die aktuell selektierte Zeile ausgegeben.

Warum ist das so? Bzw. wie komme ich in dem Moment an die richtige Zeile?
Hintergrund ist der, dass ich in der ersten Zelle (nicht sichtbar) ein Objekt habe, dessen Eigenschaften ich entsprechend setzen möchte, nur bei der falschen Reihe ändere ich dann natürlich auch das falsche Objekt.

Hier mal mein Testcode (ohne das Objekt), beinhaltet nur das Setzen des TableModels:

```
private void setModel() {
		DefaultTableModel dtm = null;
		
		Vector vCols = new Vector();
		vCols.addElement("Spalte1");
		vCols.addElement("Spalte2");
		vCols.addElement("Spalte3");
		vCols.addElement("Spalte4");
		vCols.addElement("Spalte5");
		
		Vector vRows = new Vector();
		for (int i = 0; i < 10; i++) {
			Vector vTmp = new Vector();
			for (int j = 0; j < 5; j++) {
				vTmp.addElement(String.valueOf(i)+"-"+String.valueOf(j));
			}
			vRows.addElement(vTmp);
		}
		
		dtm = new DefaultTableModel(vRows, vCols);
		tblTest.setModel(dtm);
		
		JComboBox cbTest = new JComboBox();
		cbTest.setFont(new Font("Dialog", Font.PLAIN, 11));
		cbTest.addItemListener(new java.awt.event.ItemListener() {
			public void itemStateChanged(java.awt.event.ItemEvent e) {
				System.out.print("row:");
				System.out.print(tblTest.getSelectedRow());
				System.out.print("=>itemStateChanged():");
				System.out.print(e.getItem()+":");
				System.out.print(e.getStateChange());
				if (e.getStateChange() == e.DESELECTED)
					System.out.println("(DESELECTED)");
				else
					System.out.println("(SELECTED)");
			}
		});
		cbTest.addItem("0-1");
		cbTest.addItem("1-1");
		cbTest.addItem("2-1");
		cbTest.addItem("3-1");
		cbTest.addItem("4-1");
		cbTest.addItem("5-1");
		cbTest.addItem("6-1");
		cbTest.addItem("7-1");
		cbTest.addItem("8-1");
		cbTest.addItem("9-1");
		
		DefaultCellEditor dce = new DefaultCellEditor(cbTest);
		tblTest.getSelectionModel().addListSelectionListener(new javax.swing.event.ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				System.out.println(e.getFirstIndex()+":"+e.getLastIndex());
				tblTest.setRowSelectionInterval(e.getFirstIndex(), e.getFirstIndex());
			}
		});
		tblTest.getColumnModel().getColumn(1).setCellEditor(dce);
	}
```

In dem hinzugefügten ListSelectionListener erhalte ich mit e.getFirstIndex() allerdings die richtige Zeile. Nur wird das Event immer erst nach dem der JComboBox ausgeführt.

Gruß Björn


----------



## HLX (8. Dez 2007)

Anstelle des ListSelectionListener: FocusListener an der Combobox.


```
cbTest.addFocusListener(new FocusListener() {

    public void focusGained(FocusEvent e) {
        System.out.println(tblTest.getSelectedRow()); 
        tblTest.setRowSelectionInterval(tblTest.getSelectedRow(), tblTest.getSelectedRow()); 
    }

    public void focusLost(FocusEvent e) {
        // nothing to do 
    };
});
```


----------



## Guest (9. Dez 2007)

Hallo HLX,

habe das mal geändert, bringt aber keinerlei "Verbesserung".
Das "itemStateChanged" wird vor dem "focusGained" aufgerufen und somit habe ich dann wieder die falsche Zeile.

Kann man die Reihenfolge der Events ändern?
Was mich auch wundert ist die Tatsache, dass anscheinend für die Spalte nur eine JComboBox benutzt wird und nicht pro Zeile eine eigene.

Danke & Gruß Björn


----------



## HLX (10. Dez 2007)

Hmm, das Problem hatte ich nicht.

Ich nehme an, das erste Anklicken der Combobox soll nicht unbedingt ein "itemStateChanged" hervorrufen. Dann könntest du in der Methode "itemStateChanged" noch weiter eingrenzen:

```
if(cbTest.hasFocus()) {
...
}
```


----------

