2012-03-27 13 views

Odpowiedz

47

Zarówno ItemListener, jak i ActionListener, w przypadku JCheckBox mają takie samo zachowanie. Jednak główna różnica to ItemListener może zostać wywołana przez wywołanie setSelected(true) w polu wyboru. W praktyce kodowania nie należy rejestrować zarówno ItemListener, jak iz JCheckBox, aby uniknąć niespójności.

+0

wydaje mi się, że znalazłem innego znaczenia, gdzie jeden użytkownik zgłasza ActionListener * nie * wyrzuceniu po kliknięciu pole wyboru, ale kiedy jm przełączyć kod do ItemListener, pożary zdarzeń. Tak więc czy działanie Pożary formowane mogą być zależne od L & F czy coś takiego. – Trejkaz

17

Dla odniesienia, tutaj jest sscce, który ilustruje różnicę. konsoli:

 
SELECTED 
ACTION_PERFORMED 
DESELECTED 
ACTION_PERFORMED 

Kod:

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

Różnica polega na tym, że ActionEvent jest zwolniony, gdy akcja jest wykonywana na JCheckBox że jest jego stan zostanie zmieniony poprzez kliknięcie na nim za pomocą myszki lub spacja lub mnemonik. Nie przesłuchuje zmian zdarzeń, niezależnie od tego, czy wybrano lub odznaczono JCheckBox.

Na przykład, jeśli JCheckBox c1 (powiedzieć) zostanie dodany do ButtonGroup. Zmiana stanu innego JCheckBoxes w ButtonGroup nie uruchomi ActionEvent na innym JCheckBox, zamiast tego zostanie zwolniony ItemEvent.

Ostatnie słowa:ItemEvent jest opalane nawet, gdy użytkownik odznaczy pole wyboru, wybierając inną JCheckBox (gdy w ButtonGroup), jednak ActionEvent nie jest generowany jak że zamiast ActionEvent słucha czy działanie jest wykonywane tylko na JCheckBox (dla której zarejestrowano tylko ActionListener) lub nie. Nie wie o ButtonGroup i wszystkich innych elementach zaznaczenia/cofnięcia wyboru.

3

Używam addActionListener dla JButtons, podczas gdy addItemListener jest wygodniejszy dla JToggleButton. Wraz z if(event.getStateChange()==ItemEvent.SELECTED), w tym ostatnim przypadku dodam Zdarzenia, gdy tylko JToggleButton jest zaznaczone/odznaczone.

0

Testowałem to sam i patrząc na wszystkie odpowiedzi na ten post i nie sądzę, że bardzo dobrze odpowiadają na to pytanie. Eksperymentowałem w celu uzyskania dobrej odpowiedzi (kod poniżej). MOŻESZ wystrzelić dowolne zdarzenie zarówno z ActionListener, jak i ItemListener w 100% czasu, gdy stan został zmieniony albo za pomocą przycisku radiowego albo pola wyboru, albo dowolnego innego rodzaju elementu Swing, który zakładam, ponieważ jest to typ Object. Jedyną różnicą, jaką mogę powiedzieć między tymi dwoma słuchaczami, jest typ obiektu zdarzenia, który zostaje zwrócony, gdy słuchacz jest inny. I uzyskasz lepszy typ zdarzenia z polem wyboru używając ItemListener w przeciwieństwie do ActionListener.

Typy zwrotów zdarzenia ActionEvent i ItemEvent będą przechowywane w różnych metodach, które mogą być używane po uruchomieniu typu zdarzenia. W poniższym kodzie komentarze pokazują różnicę w metodach .get dla każdego zwróconego typu zdarzenia Class.

Poniższy kod ustawia prosty JPanel z JRadioButtons, JCheckBoxes i wyświetlaczem JLabel, który zmienia się w zależności od konfiguracji przycisków. Ustawiłem wszystkie RadioButtons i CheckBoxe za pomocą nasłuchiwania akcji i odbiornika przedmiotów. Następnie napisałem klasy Listener poniżej, a ActionListener w pełni skomentował, ponieważ najpierw przetestowałem to w tym eksperymencie. Zauważysz, że jeśli dodasz ten panel do ramki i wyświetlacza, wszystkie radiobuttony i pola wyboru będą zawsze uruchamiane bez względu na typ odbiornika, po prostu skomentuj metody w jednym i wypróbuj drugie i odwrotnie.

Typ powrotu do zaimplementowanych metod to GŁÓWNA różnica między nimi. Obaj nasi słuchacze inicjują zdarzenia w ten sam sposób. Wyjaśnienie nieco wyżej w komentarzu jest powodem, dla którego pole wyboru powinno używać ItemListener ponad ActionListener z powodu zwracanego typu zdarzenia.

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

     } 

    } 
} 
Powiązane problemy