2012-03-27 5 views

답변

47

JCheckBox의 경우, ActionListener뿐만 아니라 ItemListener도 동일한 동작을합니다. 그러나 큰 차이는 ItemListener입니다.이 확인란을 선택하면 setSelected(true)으로 전화를 걸 수 있습니다. 코드 연습으로 ItemListenerActionListenerJCheckBox으로 등록하지 마십시오. 불일치가 발생하지 않습니다.

+0

나는 한 사용자들이 체크 박스를 클릭 할 때 * *이 발사되지 ActionListener를보고, 또 어디 다른 차이를 발견하는 것 IU가있는 ItemListener, 이벤트가 발생에 코드를 전환 할 때. 그래서 actionPerformed fire가 L & F 또는 무엇인가에 달려 있을지 어떨지. – Trejkaz

17

다음은 차이점을 보여주는 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(); 
      } 
     }); 
    } 
} 
23

의 차이는 작업이 마우스로 또는로 클릭하여 상태 중 하나를 변경 것입니다 JCheckBox 수행 될 때 ActionEvent 해고된다는 것이다 스페이스 바 또는 연상 기호. 실제로JCheckBox이 선택되거나 선택 취소되었는지 여부에 관계없이 이벤트를 수신 대기하십시오.

예를 들어, JCheckBox c1 (말)이 ButtonGroup에 추가 된 경우. ButtonGroup에있는 다른 JCheckBoxes의 상태를 변경하면 ActionEvent이 다른 JCheckBox에 실행되지 않고 ItemEvent이 해고됩니다.

결언 : 사용자가 (a ButtonGroup의 경우) 다른 JCheckBox을 선택하여 체크 박스의 선택을 취소하더라도ItemEvent 그러나 ActionEvent 만 동작이 수행된다 게 수신 여부 대신 ActionEvent 같이 생성되지 않고, 소성 JCheckBox (ActionListener이 등록되어있는 경우에만 해당). ButtonGroup 및 기타 모든 선택/선택 취소 항목에 대해서는 알지 못합니다.

3

JButton에 addActionListener을 사용하고 JToggleButton에는 addItemListener이 더 편리합니다. if(event.getStateChange()==ItemEvent.SELECTED)과 함께 후자의 경우 JToggleButton이 선택/선택 해제되지 않을 때마다 Events를 추가합니다.

0

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

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

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

리턴 된 유형은 구현 된 메소드에 MAIN의 차이가 있습니다. 두 리스너 모두 동일한 방식으로 이벤트를 시작합니다. 위의 주석에서 조금 더 자세히 설명하면 체크 박스가 반환되는 이벤트 유형으로 인해 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); 
      } 

     } 

    } 
}