¿Tanto ActionListener como ItemListener se utilizan para activar un evento con JCheckBox?JCheckbox - ActionListener y ItemListener?
Entonces, ¿cuál es la diferencia entre ellos y en cuyo caso uno de ellos es preferible al otro?
¿Tanto ActionListener como ItemListener se utilizan para activar un evento con JCheckBox?JCheckbox - ActionListener y ItemListener?
Entonces, ¿cuál es la diferencia entre ellos y en cuyo caso uno de ellos es preferible al otro?
Tanto ItemListener
como ActionListener
, en el caso de JCheckBox
tienen el mismo comportamiento. Sin embargo, la diferencia principal es ItemListener
que se puede activar llamando al setSelected(true)
en la casilla de verificación. Como práctica de codificación, no registre ItemListener
ni ActionListener
con JCheckBox
, para evitar incoherencias.
Como referencia, aquí hay un 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://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();
}
});
}
}
La diferencia es que ActionEvent
se activa cuando se lleva a cabo la acción en la JCheckBox
que es que es se cambia el estado o bien haciendo clic sobre ella con el ratón o con una barra espaciadora o un mnemotécnico. No es realmente escuchar para cambiar eventos si el JCheckBox
está seleccionado o no. Por ejemplo, si JCheckBox c1
(decir) se agrega a un ButtonGroup
. Cambiar el estado de otro JCheckBoxes
en el ButtonGroup
no disparará un ActionEvent
en otro JCheckBox
, en su lugar se dispara un ItemEvent
.
palabras finales: Un ItemEvent
se dispara incluso cuando el usuario deselecciona una casilla de verificación seleccionando otro JCheckBox
(cuando en un ButtonGroup
), sin embargo ActionEvent
no se genera como que en lugar ActionEvent
sólo escucha si una acción se realiza en el JCheckBox
(a la cual el ActionListener
está registrado solamente) o no. No sabe acerca de ButtonGroup
y todas las demás cosas de selección/deselección.
Yo uso addActionListener
para JButtons mientras que addItemListener
es más conveniente para JToggleButton
. Junto con if(event.getStateChange()==ItemEvent.SELECTED)
, en este último caso, agrego eventos para cada vez que se comprueba/desactiva el JToggleButton.
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 ActionEvent y un ItemEvent tendrán almacenados diferentes métodos que se pueden usar 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 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);
}
}
}
}
que parecen haber encontrado otra diferencia, donde un usuario reporta un ActionListener * * No ser despedido cuando hacen clic en la casilla de verificación, sin embargo, cuando IU cambiar el código para ItemListener, se activa el evento. Entonces, si los incendios actionPerformed podrían depender de L & F o algo así. – Trejkaz