Doppelter Aufruf von itemStateChanged unter Swing



  • Hallo Forum,
    ich habe eine JMenuBar mit einer ButtonGroup, die sich aus JRadioButtonMenuItem zusammensetzt.

    [java]
    ...
    ButtonGroup tmpBGroupColors = new ButtonGroup();

    JMenuItem tmpBGColor1 = new JRadioButtonMenuItem("Weiss");
    JMenuItem tmpBGColor2 = new JRadioButtonMenuItem("Schwarz");

    tmpBGColor1.addItemListener(this);
    tmpBGColor2.addItemListener(this);

    tmpBGroupColors.add(tmpBGColor1);
    tmpBGroupColors.add(tmpBGColor2);

    mSubMenu_BGColors.add(tmpBGColor1);
    mSubMenu_BGColors.add(tmpBGColor2);

    tmpMenu_Model.add(mSubMenu_BGColors);
    ...[/code]

    Wenn ich nun z. B. meine Applikation im Zustand "Weiss" starte und drücke im laufenden Betrieb den Radiobutton "Schwarz", wird in der Methode "itemStateChanged" zuerst "Weiss" und dann "Schwarz" auf der Konsole ausgegeben (siehe Code).
    Drücke ich dann den Radiobutton "Weiss", wird auf der Konsole ausgegeben: "Schwarz", "Weiss".
    Folglich wird die Methode doch zwei mal aufgerufen. Ich möchte sie aber nur einmal aufgerufen wissen, und zwar mit dem neuen Parameter.

    [java]
    public void itemStateChanged(ItemEvent MyEvent){
    Object tmpObject = MyEvent.getSource();

    ...

    // Radiobuttons wurde gedrückt
    if(tmpObject instanceof JRadioButtonMenuItem){
    // Den Text des gedrückten Radiobuttons auslesen
    JRadioButtonMenuItem tmpItem = (JRadioButtonMenuItem)tmpObject;
    String tmpCommand = tmpItem.getText();

    System.out.println("tmpCommand = " + tmpCommand);

    ...
    }
    }[/code]

    Hat jemand eine Idee?



  • Habe es glücklicherweise selbst gelöst. Hier der Weg:

    Man weist den JRadioButtonMenuItem statt dem ItemListener einen ActionListener zu. Dieser wird dann nur einmal aufgerufen.



  • Danke für die Info - das ist doch was für die FAQ! 🙂



  • Der Grund (glaubich):

    Wenn du 2 JRadioButtonMenuItems zu einer ButtonGroup geadded hast, weiß die ButtonGroup, dass sie reagieren muss. Wird also der eine Item gedrückt, wird der andere deselektiert. Dies löst dann sehr wahrscheinlich den zweiten (oder auch den ersten) Event aus.

    Ich hoffe, das das so stimmt!



  • @smalo: Klingt extrem plausibel 🙂


Anmelden zum Antworten