JCheckbox - ActionListener和ItemListener?

TU_*_*KAI 57 java swing actionlistener jcheckbox itemlistener

ActionListener和ItemListener都用于使用JCheckBox触发事件?

那么,它们之间有什么区别呢?在这种情况下,其中一个比另一个更受欢迎?

小智 55

两者ItemListener以及ActionListenerJCheckBox具有相同行为的情况下.但是,ItemListener通过调用setSelected(true)复选框可以触发主要区别.作为编码的做法不登记都ItemListener以及ActionListenerJCheckBox以避免不一致.


Jav*_*cal 24

不同的是,ActionEvent当在执行该操作被触发JCheckBox即它的状态是通过点击鼠标或用空格键或记忆改变无论是.无论是选择还是取消选择,它都不会真正听取更改事件JCheckBox.

例如,如果JCheckBox c1(说)添加到a ButtonGroup.改变的其他国家JCheckBoxesButtonGroup不触发一个ActionEvent对其他JCheckBox,而不是ItemEvent被解雇.

最后的话:一种ItemEvent即使当用户通过选择另一个取消选择复选框被触发JCheckBox(在一个时ButtonGroup),然而ActionEvent不是那样的产生,而不是ActionEvent只监听的动作是否在执行JCheckBox(向其中ActionListener仅注册)或没有.它不知道ButtonGroup和所有其他选择/取消选择的东西.


tra*_*god 20

作为参考,这是一个说明差异的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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)