ItemListener wird doppelt aufgerufen?
lima-city → Forum → Programmiersprachen → Java
bearbeiten
erinnerung
experiment
frohe ostern
http
hut
index
item
kurzer sinn
lange rede
phosphat
problem
punkt
schlauen buch
selektierte element
string
swing
system
verweis
zeile
-
Hallo!
Ich habe eine JComboBox (jcb) auf einem Swing-Fenster:
String items[]={"1","2","3"};
JComboBox jcb=new JComboBox(items);
jcb.setEditable(false);
ItemListener il=new jcb_Changed();
jcb.addItemListener(il);
wndMain.getContentPane().add(jcb);
Wenn der Benutzer einen Eintrag ausw?hlt, wird direkt eine Aktion ausgef?hrt. Daf?r gibt's den ItemListener:
class jcb_Changed implements ItemListener {
public void itemStateChanged(ItemEvent e) {
System.out.println("changed!");
}
}
Wenn ich das jetzt ausprobiere und einen(!) Punkt ausw?hle, erscheint auf der Standardausgabe:
changed!
changed!
was f?r mich bedeutet, dass itemStateChanged zweimal ausgef?hrt wird. Aber warum?
Danke und Frohe Ostern,
thw -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
teste doch mla ?ber
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComboBox.html#getItemListeners()
ob dein itemListener wirklich nur 1x bei der combobox registriert ist.
Vielleicht idt er ja tats?chlich 2x hinzugef?gt worden -
Okay Leute, die Sache beginnt, richtig interessant zu werden :-)
Folgender Quellcode (zur Erinnerung):
// Erstellen der ComboBox (in main()):
String items[]={"1","2","3"};
JComboBox jcb=new JComboBox(items);
jcb.setEditable(false);
ItemListener il_cmd=new jcb_Changed();
jcb.addItemListener(il_cmd);
wndMain.getContentPane().add(jcb);
-----
Experiment 1:
// Diese Zeile in main() oder in itemStateChanged eingesetzt, gibt "2" aus
System.out.println(String.valueOf(jcb.getItemListeners().length));
-----
Experiment 2:
/* Die Zeile
* jcb.addItemListener(il_cmd);
* in main() auskommentiert
*/
// Diese Zeile in main() gibt "1" aus (kann den zweiten addItemListener beim besten Willen nicht finden!
System.out.println(String.valueOf(jcb.getItemListeners().length));
// Diese Zeile in itemStateChanged gibt *nicht* aus --> itemStateChanged wird *nicht* ausgef?hrt.
System.out.println(String.valueOf(jcb.getItemListeners().length));
=> Wie jetzt???
Ich habe mal versucht, mit jcb.getItemListener()[0].toString() herauszufinden, auf welchen ItemListener das Ding verweist (wenn die Zeile jcb.addItemListener(il_cmd) in main() auskommentiert ist).
Das Ergebnis war folgendes:
javax.swing.plaf.basic.BasicComboPopup$ItemHandler@12aea3e
Sagt mir leider nicht allzuviel.
Wenn ich den ItemListener in main() anmelde, gibt's dann halt zus?tzlich zu diesem noch einen Verweis auf meine jcb_Changed-Klasse (mit Index 0; der o.g. hat dann den Index 1).
Was hat denn jetzt dieser ItemListener mit meinem am Hut (so dass meiner zweimal ausgef?hrt wird)?
Das L?schen des mir unbekannten ItemListeners mit
jcb.removeItemListener(jcb.getItemListeners()[1]);
bringt gar nichts, itemStateChanged wird weiterhin doppelt ausgef?hrt. Jedoch erzeugt Java dann beim Versuch, auf den ItemListener mit Index 1 zuzugreifen, korrekterweise eine ArrayOutOfBoundsException.
Lange Rede, kurzer Sinn: Java spinnt. Oder?
F?r kreative L?sungideen bin ich immer zu haben, das Problem interessiert mich jetzt wirklich :-)
thw -
Hallo,
ich wei? nicht ob dich das Problem immer noch besch?ftigt, aber ich hab mal in meinem schlauen Buch nachgeschaut und da steht:
"Eine JComboBox sendet ein ItemEvent an den regestrierten ItemListener und zwar sowohl f?r das selektierte, als auch f?r das deselktierte Element"
Das erkl?rt warum der ItemListener zweimal aufgerufen wird.
Willst du das selektierte Element haben dann geht das ?ber
jcb.getSelectedItem();
analog nat?rlich auch
jcb.getSelectedIndex();
Aber das wei?t du sicher schon :)
Gru?,
Phosphat -
nun, die Methode heisst "itemStateChanged()" und von einer solchen ?nderung sind zwei Eintr?ge betroffen, der vorher ausgew?hlte ist nun nicht mehr ausgew?hlt, und der nun gew?hlte war zuvor nicht ausgew?hlt. Hat also eine gewisse Logig; das Ereignis, was Du m?glicherweise haben m?chtest, n?mlich nur "ich wurde ausgew?hlt", l?sst sich mit einem FocusListener bearbeiten.
greetinx
WS -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage