developer tip

JCheckbox-ActionListener 및 ItemListener?

optionbox 2020. 12. 24. 23:37
반응형

JCheckbox-ActionListener 및 ItemListener?


ActionListener와 ItemListener 모두 JCheckBox로 이벤트를 발생시키는 데 사용됩니까?

그렇다면 그들 중 하나가 다른 것보다 선호되는 경우 차이점은 무엇입니까?


ItemListener뿐만 아니라 ActionListener,의 경우는 JCheckBox같은 동작을합니다. 그러나 큰 차이점은 확인란 ItemListener을 호출하여 트리거 할 수 있습니다 setSelected(true). 모두를 등록하지 않는 코딩 연습으로 ItemListener뿐만 아니라 ActionListenerJCheckBox피할 불일치하기 위해,.


차이점은 마우스로 클릭하거나 스페이스 바 또는 니모닉으로 클릭하여 상태가 변경된다는 점 ActionEvent에서 작업이 수행 될 때 시작 JCheckBox된다는 것입니다. 이 선택 또는 선택 취소 여부에 관계없이 변경 이벤트를 실제로 수신 하지 않습니다 JCheckBox.

예를 들어, JCheckBox c1(말)이 ButtonGroup. 기타의 상태를 변경 JCheckBoxes에서하는 ButtonGroup을 발생하지 않습니다 ActionEvent다른 한편으로 JCheckBox, 대신이 ItemEvent발생합니다.

마지막 단어 : An ItemEvent은 사용자가 다른 확인란을 선택하여 확인란을 선택 취소하더라도 JCheckBox(a에서 ButtonGroup) 실행되지만, ActionEvent대신 ActionEvent에 작업이 수행되었는지 JCheckBox( ActionListener가 등록 된 경우에만) 수행되는지 여부 만 수신 대기 하는 것처럼 생성 되지 않습니다. ButtonGroup다른 모든 선택 / 선택 해제 항목 에 대해 알지 못합니다 .


참고로, 차이점 을 보여주는 sscce 가 있습니다. 콘솔:

선택된
ACTION_PERFORMED
선택 취소됨
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하는 동안 JButton의에 대한 addItemListenerA에 대한 더 편리합니다 JToggleButton. 와 함께 if(event.getStateChange()==ItemEvent.SELECTED)후자의 경우 JToggleButton이 선택 / 선택 취소 될 때마다 이벤트를 추가합니다.


나는 이것을 직접 테스트 하고이 게시물의 모든 답변을 살펴 보았고 그들이이 질문에 잘 대답하지 않는다고 생각합니다. 나는 좋은 대답을 얻기 위해 자신을 실험했습니다 (아래 코드). 라디오 버튼이나 체크 박스에서 상태가 변경 될 때마다 ActionListener와 ItemListener 모두를 사용하여 이벤트를 100 % 발생시킬 수 있습니다. 또는 Object 유형이기 때문에 제가 가정하고있는 다른 종류의 Swing 항목입니다. 이 두 리스너간에 내가 알 수있는 유일한 차이점은 리스너와 함께 반환되는 이벤트 객체의 유형이 다르다는 것입니다. 그리고 ActionListener가 아닌 ItemListener를 사용하는 확인란으로 더 나은 이벤트 유형을 얻습니다.

ActionEvent 및 ItemEvent의 반환 유형에는 이벤트 유형이 시작될 때 사용할 수있는 다른 메서드가 저장됩니다. 아래 코드에서 주석은 각 클래스에서 반환 된 이벤트 유형에 대한 .get 메서드의 차이점을 보여줍니다.

아래 코드는 버튼 구성에 따라 변경되는 JRadioButtons, JCheckBoxes 및 JLabel 디스플레이로 간단한 JPanel을 설정합니다. Action Listener와 Item Listener를 모두 사용하여 모든 RadioButton 및 CheckBox를 설정했습니다. 그런 다음이 실험에서 먼저 테스트했기 때문에 ActionListener가 완전히 주석 처리 된 아래 Listener 클래스를 작성했습니다. 이 패널을 프레임 및 디스플레이에 추가하면 리스너 유형에 관계없이 모든 라디오 버튼과 확인란이 항상 실행된다는 것을 알 수 있습니다. 하나의 메서드를 주석 처리하고 다른 메서드를 시도하거나 그 반대의 경우도 마찬가지입니다.

구현 된 메소드에 대한 리턴 유형은 둘 사이의 주요 차이점입니다. 두 리스너 모두 동일한 방식으로 이벤트를 발생시킵니다. 위의 주석에서 조금 더 잘 설명 된 것은 반환되는 이벤트 유형으로 인해 확인란이 ActionListener보다 ItemListener를 사용해야하는 이유입니다.

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

        }

    }
}

참조 URL : https://stackoverflow.com/questions/9882845/jcheckbox-actionlistener-and-itemlistener

반응형