# JComboBox und itemStateChange()-Methode



## L-ectron-X (18. Mai 2004)

Ich habe in eine GUI-Klasse eine JComboBox eingebaut, und an dieser einen ItemListener registriert.
In meiner Klasse habe ich dann die itemStateChange()-Methode überschrieben.
Das komische an der Sache ist: jedes Mal wenn ich den Wert in der JComboBox durch klicken ändere, wird die itemStateChange()-Methode zwei mal aufgerufen. ???:L 
Warum?


----------



## Beni (18. Mai 2004)

Sorry, aber ohne Code wird da nicht viel...

- Hast du den Listener vielleicht zweimal angemeldet?
- Veränderst du die Selektion aus dem "itemStateChanged" heraus?
- Hast du mal mit einem Debugger nachgebort (StackTrace untersuchen!)

mfg Beni


----------



## L-ectron-X (18. Mai 2004)

Nein Listener ist nur einmal mittels anonymer Klasse angemeldet
Die itemStateChanged()-Methode ändert nichts an der JComboBox.
Nein, mit dem Debugger war ich noch nicht dran.


```
//itemStateChanged()-Methode der JComboBox
private void cb_portionItemStateChanged(java.awt.event.ItemEvent evt) {

  int rows = ta_details.getRowCount(); //JTable Zeilen zählen

  if(rows > 0) {
    String portionen = (String)cb_portion.getSelectedItem(); //Anzahl als String-Objekt

    for(int i = 0; i < rows; i++) {
      //Berechnung eines Rezepts (wird zweimal durchgeführt)

      ta_details.setValueAt(RezeptRechner.berechneRezept(
      (String)ta_details.getValueAt(i, 1), portionen), i, 1);
    }
  }
}
```
In der Klasse RezeptRechner werden die Strings in benötigte Zahlenformate umgewandelt, die Berechnung durchgeführt und das Ergebnis zurück gegeben.
Ich hatte zu Beginn dieser Methode eine println-Methode gesetzt, um raus zu bekommen, wie oft die Methode bei Auswahl einer Zahl in der JComboBox aufgefufen wird. Genau zwei mal. ???:L


----------



## bygones (19. Mai 2004)

L-ectron-X hat gesagt.:
			
		

> Das komische an der Sache ist: jedes Mal wenn ich den Wert in der JComboBox durch klicken ändere, wird die itemStateChange()-Methode zwei mal aufgerufen. ???:L
> Warum?


Weil einmal eine Event gefeuert wird, dass das eine Element *deselektiert* und einmal ein Event gefeuert wird, weil das andere Element *selektiert* wurde



> itemStateChanged(ItemEvent e)
> Invoked when an item has been selected or deselected by the user.


Du kannst über die Methode ItemEvent.getStateChange() ermitteln obs ItemEvent.SELECTED oder ItemEvent.DESELECTED ist - und je nach dem reagieren.
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/ItemEvent.html


----------



## L-ectron-X (19. Mai 2004)

Ah, super!
Dann habe ich wohl falsch angesetzt. Danke.


----------

