Оба ActionListener и ItemListener используются для запуска события с помощью JCheckBox?
Итак, какая разница между ними, и в этом случае один из них предпочтительнее другого?
Оба ActionListener и ItemListener используются для запуска события с помощью JCheckBox?
Итак, какая разница между ними, и в этом случае один из них предпочтительнее другого?
Оба ItemListener
, а также ActionListener
, в случае JCheckBox
имеют одинаковое поведение.
Однако основная разница ItemListener
может быть вызвана вызовом setSelected(true)
на флажке.
Поскольку практика кодирования не регистрирует как ItemListener
, так и ActionListener
с помощью JCheckBox
, чтобы избежать несогласованности.
Разница в том, что ActionEvent
запускается, когда действие выполняется в JCheckBox
, то есть состояние изменяется либо путем нажатия на него мышью, либо с помощью пробела или мнемоники. Это не действительно слушать изменения событий, выбрано или отменено JCheckBox
.
Например, если JCheckBox c1
(скажем) добавляется к ButtonGroup
. Изменение состояния другого JCheckBoxes
в ButtonGroup
не приведет к срабатыванию ActionEvent
на другом JCheckBox
, вместо этого запускается ItemEvent
.
Заключительные слова: А ItemEvent
запускается, даже если пользователь отменяет выбор флажка, выбирая другой JCheckBox
(когда в ButtonGroup
), однако ActionEvent
не генерируется, как что вместо ActionEvent
только прослушивает, выполняется ли действие на JCheckBox
(к которому зарегистрирован только ActionListener
) или нет. Он не знает о ButtonGroup
и всех других материалах выбора/отмены.
Для справки, здесь 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();
}
});
}
}
Я использую addActionListener
для JButtons, тогда как addItemListener
удобнее для JToggleButton
. Вместе с if(event.getStateChange()==ItemEvent.SELECTED)
, в последнем случае, я добавляю события для всякий раз, когда JToggleButton проверяется/не проверяется.
Я сам тестировал это и смотрел на все ответы на этот пост, и я не думаю, что они очень хорошо отвечали на этот вопрос. Я экспериментировал сам, чтобы получить хороший ответ (код ниже). Вы можете запустить оба события как с помощью ActionListener, так и с ItemListener в 100% случаев, когда состояние изменяется либо с помощью переключателя или флажка, либо с любым другим видом элемента Swing, который я принимаю, поскольку это тип Object. Единственная разница, которую я могу рассказать между этими двумя слушателями, - это тип объекта события, который возвращается с прослушивателем. И вы получаете лучший тип события с помощью флажка с помощью ItemListener, а не ActionListener.
Обратные типы ActionEvent и ItemEvent будут иметь разные методы, которые могут быть использованы при запуске типа события. В приведенном ниже коде комментарии показывают разницу в методах .get для каждого типа возвращаемого класса.
Нижеприведенный код устанавливает простой JPanel с JRadioButtons, JCheckBoxes и JLabel, который изменяется на основе конфигураций кнопок. Я установил все RadioButtons и CheckBoxes как с прослушивателем событий, так и с прослушивателем элементов. Затем я написал классы Listener, приведенные ниже, с помощью ActionListener, полностью прокомментированного, потому что я сначала тестировал его в этом эксперименте. Вы заметите, что если вы добавите эту панель в кадр и отобразите, все радиокнопки и флажки всегда будут срабатывать независимо от типа Listener, просто закомментируйте методы в одном и попробуйте другой и наоборот.
Тип возврата в реализованные методы - это главное различие между ними. Оба прослушивателя запускают события одинаково. Объяснение немного лучше в комментарии выше - причина, по которой флажок должен использовать ItemListener над ActionListener из-за возвращаемого типа события.
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);
}
}
}
}