ejemplo java swing actionlistener jcheckbox itemlistener

java - ejemplo - JCheckbox-ActionListener y ItemListener?



jcheckbox is checked (5)

¿ActionListener y ItemListener se utilizan para activar un evento con JCheckBox?

Entonces, ¿cuál es la diferencia entre ellos y en cuyo caso uno de ellos es preferible al otro?


Como referencia, aquí hay una sscce que ilustra la diferencia. Consola:

SELECTED ACTION_PERFORMED DESELECTED ACTION_PERFORMED

Código:

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://.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(); } }); } }


He estado probando esto yo mismo, y mirando todas las respuestas en esta publicación y no creo que respondan muy bien a esta pregunta. Experimenté para obtener una buena respuesta (código a continuación). PUEDE desencadenar cualquier evento con ActionListener y ItemListener el 100% del tiempo cuando se cambia un estado en un botón de opción o en una casilla de verificación, o cualquier otro tipo de elemento de Swing que asuma, ya que es un tipo Object. La ÚNICA diferencia que puedo decir entre estos dos oyentes es que el tipo de objeto de evento que se devuelve con el oyente es diferente. Y obtienes un mejor tipo de evento con una casilla de verificación usando un ItemListener en lugar de un ActionListener.

Los tipos de devolución de un evento de acción y un evento de artículo tendrán almacenados diferentes métodos que pueden usarse cuando se dispara un tipo de evento. En el siguiente código, los comentarios muestran la diferencia en los métodos .get para cada tipo de evento devuelto por la clase.

El siguiente código configura un JPanel simple con JRadioButtons, JCheckBoxes y una pantalla JLabel que cambia según las configuraciones de los botones. Configuré todos los RadioButtons y CheckBoxes con un Listener de Acción y un Listener de Elemento. Luego escribí las clases de Listener a continuación con ActionListener completamente comentado porque lo probé primero en este experimento. Notarás que si agregas este panel a un recuadro y a una pantalla, todos los botones de radio y las casillas de verificación siempre se disparan independientemente del tipo de Oyente, solo comenta los métodos en uno y prueba el otro y viceversa.

Tipo de devolución en los métodos implementados es la diferencia PRINCIPAL entre los dos. Ambos oyentes disparan eventos de la misma manera. Explicado un poco mejor en el comentario anterior es la razón por la cual una casilla de verificación debería usar un ItemListener sobre ActionListener debido al tipo de evento que se devuelve.

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


La diferencia es que ActionEvent se ActionEvent cuando la acción se realiza en JCheckBox es decir, su estado se cambia haciendo clic en él con el mouse o con una barra espaciadora o un mnemónico. Realmente no escucha los eventos de cambio si JCheckBox está seleccionado o no seleccionado.

Por ejemplo, si JCheckBox c1 (por ejemplo) se agrega a un ButtonGroup . Cambiar el estado de otras JCheckBoxes en ButtonGroup no ActionEvent un ActionEvent en otra JCheckBox , sino que se ItemEvent un ItemEvent .

Palabras finales: un ItemEvent se dispara incluso cuando el usuario anula la selección de una casilla de verificación seleccionando otra JCheckBox (cuando está en un ButtonGroup ), sin embargo ActionEvent no se genera así, ActionEvent solo escucha si se realiza una acción en la JCheckBox (a la que JCheckBox el ActionListener está registrado solo) o no. No sabe sobre ButtonGroup y todas las otras cosas de selección / deselección.


Yo uso addActionListener para JButtons mientras que addItemListener es más conveniente para un JToggleButton . Junto con if(event.getStateChange()==ItemEvent.SELECTED) , en este último caso, agrego eventos para cada vez que JToggleButton esté marcado / desmarcado.


Tanto ItemListener como ActionListener , en el caso de JCheckBox tienen el mismo comportamiento. Sin embargo, la principal diferencia es que ItemListener se puede activar llamando a setSelected(true) en la casilla de verificación. Como práctica de codificación, no registre tanto ItemListener como ActionListener con JCheckBox , para evitar incoherencias.