Подтвердить что ты не робот

JCheckbox - ActionListener и ItemListener?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Для справки, здесь 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();
            }
        });
    }
}

Ответ 4

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

Ответ 5

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

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

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

Тип возврата в реализованные методы - это главное различие между ними. Оба прослушивателя запускают события одинаково. Объяснение немного лучше в комментарии выше - причина, по которой флажок должен использовать 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);
            }

        }

    }
}