kostenloser Webspace werbefrei: lima-city


ItemListener wird doppelt aufgerufen?

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    thw

    Kostenloser Webspace von thw

    thw hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 2**s

    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
  4. Autor dieses Themas

    thw

    Kostenloser Webspace von thw

    thw hat kostenlosen Webspace.

    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
  5. 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
  6. g*********b

    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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!