JCheckbox-ActionListener et ItemListener?

ActionListener et ItemListener sont utilisés pour lancer un événement avec JCheckBox?

Alors, quelle est la différence entre eux et dans ce cas, l'un d'eux est préféré à l'autre?

53
demandé sur mKorbel 2012-03-27 07:06:39

5 réponses

les deux ItemListener ainsi que ActionListener , dans le cas de JCheckBox ont le même comportement. Cependant, la différence majeure est ItemListener peut être déclenchée en appelant le setSelected(true) sur la case à cocher. Comme pratique de codage, ne pas enregistrer à la fois ItemListener et ActionListener avec le JCheckBox , afin d'éviter toute incohérence.

48
répondu NiranjanBhat 2013-07-11 10:30:14

la différence est que ActionEvent est tiré lorsque l'action est effectuée sur le JCheckBox qui est son état est modifié soit en cliquant dessus avec la souris ou avec une barre d'espace ou un mnémonique. Il ne vraiment écouter changer les événements si le JCheckBox est sélectionné ou désélectionné.

par exemple, si JCheckBox c1 (say) est ajouté à un ButtonGroup . Changer l'état de l'autre JCheckBoxes dans le ButtonGroup ne tirera pas un ActionEvent sur l'autre JCheckBox , au lieu d'un ItemEvent est tiré.

derniers mots: un ItemEvent est déclenché même lorsque l'utilisateur désélectionne une case à cocher en sélectionnant un autre JCheckBox (dans un ButtonGroup ), cependant ActionEvent n'est pas généré comme cela ActionEvent n'écoute que si une action est effectuée sur le JCheckBox (auquel le ActionListener est enregistré seulement) ou non. Il ne sait pas à propos de ButtonGroup et tous les autres trucs de sélection/désélection.

23
répondu JavaTechnical 2013-07-10 16:42:28

pour référence, voici un sscce qui illustre la différence. Console:

SELECTED
ACTION_PERFORMED
DESELECTED
ACTION_PERFORMED

Code:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see /q/jcheckbox-actionlistener-and-itemlistener-36653/"Listeners");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JCheckBox b = new JCheckBox("JCheckBox");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getID() == ActionEvent.ACTION_PERFORMED
                    ? "ACTION_PERFORMED" : e.getID());
            }
        });
        b.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                System.out.println(e.getStateChange() == ItemEvent.SELECTED
                    ? "SELECTED" : "DESELECTED");
            }
        });
        JPanel p = new JPanel();
        p.add(b);
        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Listeners().display();
            }
        });
    }
}
19
répondu trashgod 2013-09-02 13:46:29

j'utilise addActionListener pour JButtons alors que addItemListener est plus commode pour un JToggleButton . Avec if(event.getStateChange()==ItemEvent.SELECTED) , dans ce dernier cas, j'ajoute des événements pour chaque fois que le bouton JToggleButton est coché/non coché.

3
répondu mario go 2013-10-22 20:19:19

Je l'ai testé moi-même, et en regardant toutes les réponses sur ce post et je ne pense pas qu'ils répondent à cette question très bien. J'ai expérimenté moi-même afin d'obtenir une bonne réponse (code ci-dessous). Vous pouvez lancer l'un ou l'autre événement avec ActionListener et ItemListener 100% du temps quand un État est changé dans un bouton radio ou une case à cocher, ou tout autre type D'élément Swing que je suppose car il est type Objet. La seule différence que je peux dire entre ces deux auditeurs est le type D'objet Event qui est retourné avec l'écouteur est différent. Et vous obtenez un meilleur type d'événement avec une case à cocher en utilisant un ItemListener par opposition à un ActionListener.

les types de retour D'un ActionEvent et D'un ItemEvent auront différentes méthodes stockées qui peuvent être utilisées lorsqu'un type D'événement est tiré. Dans le code ci-dessous les commentaires montrent la différence .obtenez les méthodes pour chaque type d'événement retourné par la classe.

le code ci-dessous établit JPanel simple avec JRadioButtons, JCheckBoxes, et un écran JLabel qui change basé sur Bouton configs. J'ai réglé tous les RadioButtons et les cases à cocher avec à la fois un écouteur D'Action et un écouteur d'Item. Puis j'ai écrit les classes D'écoute ci-dessous avec ActionListener pleinement commenté parce que je l'ai testé en premier dans cette expérience. Vous remarquerez que si vous ajoutez ce panneau à un cadre et un écran, tous les radiobuttons et les cases à cocher tirent toujours quel que soit le type d'écouteur, il suffit de commenter le méthodes dans l'un et essayer l'autre et vice versa.

Le type de retour

dans les méthodes mises en œuvre est la principale différence entre les deux. Les deux auditeurs tirent les évènements de la même façon. Expliqué un peu mieux dans le commentaire ci-dessus est la raison pour laquelle une case à cocher devrait utiliser un ItemListener sur ActionListener en raison du type d'événement qui est retourné.

package EventHandledClasses;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RadioButtonsAndCheckBoxesTest extends JPanel{
JLabel display;
String funny, serious, political;
JCheckBox bold,italic;
JRadioButton funnyQuote, seriousQuote, politicalQuote;
ButtonGroup quotes;

    public RadioButtonsAndCheckBoxesTest(){
        funny = "You are not ugly, you were just born... different";
        serious = "Recommend powdered soap in prison!";
        political = "Trump can eat a little Bernie, but will choke on his     Birdie";

        display = new JLabel(funny);
        Font defaultFont = new Font("Ariel",Font.PLAIN,20);
        display.setFont(defaultFont);

        bold = new JCheckBox("Bold",false);
        bold.setOpaque(false);
        italic = new JCheckBox("Italic",false);
        italic.setOpaque(false);

        //Color itemBackground =

        funnyQuote = new JRadioButton("Funny",true);
        funnyQuote.setOpaque(false);
        seriousQuote = new JRadioButton("Serious");
        seriousQuote.setOpaque(false);
        politicalQuote = new JRadioButton("Political");
        politicalQuote.setOpaque(false);

        quotes = new ButtonGroup();
        quotes.add(funnyQuote);
        quotes.add(seriousQuote);
        quotes.add(politicalQuote);

        JPanel primary = new JPanel();
        primary.setPreferredSize(new Dimension(550, 100));

        Dimension standard = new Dimension(500, 30);

        JPanel radioButtonsPanel = new JPanel();
        radioButtonsPanel.setPreferredSize(standard);
        radioButtonsPanel.setBackground(Color.green);
        radioButtonsPanel.add(funnyQuote);
        radioButtonsPanel.add(seriousQuote);
        radioButtonsPanel.add(politicalQuote);

        JPanel checkBoxPanel = new JPanel();
        checkBoxPanel.setPreferredSize(standard);
        checkBoxPanel.setBackground(Color.green);
        checkBoxPanel.add(bold);
        checkBoxPanel.add(italic);

        primary.add(display);
        primary.add(radioButtonsPanel);
        primary.add(checkBoxPanel);

        //Add Action Listener To test Radio Buttons
        funnyQuote.addActionListener(new ActionListen());
        seriousQuote.addActionListener(new ActionListen());
        politicalQuote.addActionListener(new ActionListen());

        //Add Item Listener to test Radio Buttons
        funnyQuote.addItemListener(new ItemListen());
        seriousQuote.addItemListener(new ItemListen());
        politicalQuote.addItemListener(new ItemListen());

        //Add Action Listener to test Check Boxes
        bold.addActionListener(new ActionListen());
        italic.addActionListener(new ActionListen());

        //Add Item Listener to test Check Boxes
        bold.addItemListener(new ItemListen());
        italic.addItemListener(new ItemListen());

        //adds primary JPanel to this JPanel Object
        add(primary);   
    }

    private class ActionListen implements ActionListener{

        public void actionPerformed(ActionEvent e) {

         /*
         Different Get Methods from  ItemEvent 
         e.getWhen()
         e.getModifiers()
         e.getActionCommand()*/

            /*int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }*/
        }
    }
    private class ItemListen implements ItemListener {

        public void itemStateChanged(ItemEvent arg0) {

            /*
            Different Get Methods from ActionEvent
            arg0.getItemSelectable()
            arg0.getStateChange()
            arg0.getItem()*/


            int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }

        }

    }
}
1
répondu maximusg 2016-03-27 20:22:26