JCheckbox - ActionListener и ItemListener? - PullRequest
56 голосов
/ 27 марта 2012

Оба ActionListener и ItemListener используются для запуска события с JCheckBox?

Итак, в чем разница между ними и в каком случае один из них предпочтительнее другого?

Ответы [ 5 ]

52 голосов
/ 27 марта 2012

И ItemListener, и ActionListener, в случае JCheckBox ведут себя одинаково. Тем не менее, основная разница в ItemListener может быть вызвана путем вызова setSelected(true) на флажок. В качестве практики кодирования не регистрируйте как ItemListener, так и ActionListener с JCheckBox, чтобы избежать несоответствия.

24 голосов
/ 10 июля 2013

Разница в том, что ActionEvent запускается, когда действие выполняется на JCheckBox, то есть его состояние изменяется либо щелчком по нему мышью, либо пробелом, либо мнемоникой. на самом деле не прослушивает события изменения, независимо от того, выбран или отменен JCheckBox.

Например, если JCheckBox c1 (скажем) добавлено к ButtonGroup.Изменение состояния другого JCheckBoxes в ButtonGroup не вызовет ActionEvent в других JCheckBox, вместо этого ItemEvent срабатывает.

Заключительные слова: AnItemEvent срабатывает, даже когда пользователь снимает флажок, выбирая другой JCheckBox (когда в ButtonGroup), однако ActionEvent не генерируется таким образом, вместо этого ActionEvent только прослушивает, выполняется ли действие надJCheckBox (для которого зарегистрирован ActionListener) или нет.Он не знает о ButtonGroup и всех других элементах выбора / отмены выбора.

20 голосов
/ 27 марта 2012

Для справки, вот sscce , который иллюстрирует разницу.Консоль:

SELECTED
ACTION_PERFORMED
DESELECTED
ACTION_PERFORMED

Код:

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 http://stackoverflow.com/q/9882845/230513 */
public class Listeners {

    private void display() {
        JFrame f = new JFrame("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();
            }
        });
    }
}
3 голосов
/ 23 октября 2013

Я использую addActionListener для кнопок J, тогда как addItemListener удобнее для JToggleButton.Вместе с if(event.getStateChange()==ItemEvent.SELECTED), в последнем случае, я добавляю События для каждого случая, когда JToggleButton отмечен / не отмечен.

1 голос
/ 27 марта 2016

Я сам проверял это и просматривал все ответы в этом посте, и я не думаю, что они отвечают на этот вопрос очень хорошо.Я экспериментировал сам, чтобы получить хороший ответ (код ниже).Вы МОЖЕТЕ запускать любое событие как с помощью ActionListener, так и ItemListener в 100% случаев, когда состояние изменяется с помощью либо переключателя, либо флажка, либо любого другого типа Swing-элемента, который я предполагаю, поскольку это тип Object.Единственное различие, которое я могу сказать между этими двумя слушателями, заключается в том, что тип объекта события, возвращаемого слушателем, отличается.И вы получите лучший тип события с помощью флажка, используя ItemListener, в отличие от ActionListener.

Типы возврата ActionEvent и ItemEvent будут иметь различные сохраненные методы, которые могут использоваться при запуске Event Type.В приведенном ниже коде комментарии показывают разницу в методах .get для каждого возвращаемого класса. Тип события.

Приведенный ниже код устанавливает простой JPanel с JRadioButtons, JCheckBoxes и дисплеем JLabel, который изменяется в зависимости от настроек кнопок.Я установил все RadioButtons и CheckBox с помощью прослушивателя действий и прослушивателя предметов.Затем я написал классы Listener, приведенные ниже, с полностью прокомментированным ActionListener, потому что сначала я протестировал его в этом эксперименте.Вы заметите, что если вы добавите эту панель к кадру и отобразите, все радиокнопки и флажки всегда срабатывают независимо от типа слушателя, просто закомментируйте методы в одном и попробуйте другой и наоборот.

Тип возвращаемого значения в реализованных методах - это ОСНОВНАЯ разница между ними.Оба слушателя запускают события одинаково.Немного лучше объяснено в комментарии выше причина, по которой флажок должен использовать ItemListener вместо ActionListener из-за типа возвращаемого события.

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);
            }

        }

    }
}
...