JCheckbox-ActionListener и ItemListener?



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



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

637   5  

5 ответов:

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

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

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

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

Для справки, вот 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();
            }
        });
    }
}

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

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

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

приведенный ниже код устанавливает простой JPanel с JRadioButtons, JCheckBoxes и jlabel отображают изменения, основанные на конфигурациях кнопок. Я установил все радиокнопки и флажки как с Прослушивателем действий, так и с Прослушивателем элементов. Затем я написал классы слушателя ниже с 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);
            }

        }

    }
}

Comments

    Ничего не найдено.