---
category: swing
folder: ItemListenerActionListener
title: ItemListenerとActionListenerの動作の違いを比較する
tags: [ItemListener, ActionListener, JComboBox, JCheckBox, JRadioButton, ButtonGroup]
author: aterai
pubdate: 2018-04-23T18:28:12+09:00
description: JComboBoxやJCheckBoxなどに設定したItemListenerとActionListenerの動作を比較テストします。
image: https://drive.google.com/uc?id=1xpBmSl-frNjI1eCiUe2pzY2vo6Zp_FpKjA
---
* 概要 [#summary]
`JComboBox`や`JCheckBox`などに設定した`ItemListener`と`ActionListener`の動作を比較テストします。

#download(https://drive.google.com/uc?id=1xpBmSl-frNjI1eCiUe2pzY2vo6Zp_FpKjA)

* サンプルコード [#sourcecode]
#code(link){{
JComboBox<DayOfWeek> combo = new JComboBox<>(DayOfWeek.values());
combo.addItemListener(e -> {
  ItemSelectable c = e.getItemSelectable();
  DayOfWeek dow = (DayOfWeek) e.getItem();
  boolean b = e.getStateChange() == ItemEvent.SELECTED;
  print(textArea, "ItemListener", c.getClass(), b, dow);
});
combo.addActionListener(e -> {
  Object c = e.getSource();
  DayOfWeek dow = combo.getItemAt(combo.getSelectedIndex());
  boolean b = Objects.equals("comboBoxChanged", e.getActionCommand());
  print(textArea, "ActionListener", c.getClass(), b, dow);
});
}}

* 解説 [#explanation]
- `JComboBox`
-- `ItemListener`
--- `ItemEvent#getItemSelectable()`でイベント元の`JComboBox`が取得可能
--- `ItemEvent#getItem()`で`JComboBox`で選択されたアイテムが取得可能
--- `ItemEvent#getStateChange()`で`JComboBox`のアイテムが選択、選択解除されたかを取得可能
--- `JComboBox#setSelectedIndex(...)`メソッドなどを使用して`JComboBox`を直接マウスやキー入力で操作しなくても、`ItemEvent`は発生する
--- `JComboBox`の同じアイテムを選択しても`ItemEvent`は発生しない
-- `ActionListener`
--- `ActionEvent#getSource()`でイベント元の`JComboBox`が取得可能
--- デフォルトの`JComboBox`は、`ActionEvent#getActionCommand()`で`"comboBoxChanged"`を返す
--- `JComboBox#setSelectedIndex(...)`メソッドなどを使用して`JComboBox`を直接マウスやキー入力で操作しなくても、`ActionEvent`は発生する
--- `JComboBox`の同じアイテムを選択しても`ActionEvent`は発生する
- `JCheckBox`
-- `ItemListener`
--- `ItemEvent#getItemSelectable()`、または`ItemEvent#getItem()`でイベント元の`JCheckBox`が取得可能
--- `ItemEvent#getStateChange()`で`JCheckBox`が選択されたかを取得可能
--- `JCheckBox#setSelected(...)`メソッドなどを使用して`JCheckBox`を直接マウスやキー入力で操作しなくても、`ItemEvent`は発生する
--- `JCheckBox#setSelected(...)`メソッドを使用しても選択状態が変化しない場合、`ItemEvent`は発生しない
-- `ActionListener`
--- `ActionEvent#getSource()`でイベント元の`JCheckBox`が取得可能
--- デフォルトの`JCheckBox`は、`ActionEvent#getActionCommand()`で`JCheckBox#getText()`と同じ値を返す
--- `JCheckBox#setSelected(...)`メソッドなどを使用して`JCheckBox`の状態を変更しても、`ActionEvent`は発生しない
- `JRadioButton`(`ButtonGroup`)
-- `ItemListener`
--- `ItemEvent#getItemSelectable()`、または`ItemEvent#getItem()`でイベント元の`JCheckBox`が取得可能
--- `ItemEvent#getStateChange()`で`JRadioButton`が選択されたかを取得可能
--- `JRadioButton#setSelected(...)`メソッドなどを使用して`JRadioButton`を直接マウスやキー入力で操作しなくても、`ItemEvent`は発生する
--- `JRadioButton#setSelected(...)`メソッドを使用しても選択状態が変化しない場合、`ItemEvent`は発生しない
--- 注: `ButtonGroup#getSelection()`は、`JRadioButton#setSelected(...)`メソッドを使用して選択変更した場合は`null`、マウスなどで選択変更した場合はその`ButtonModel`を返す
-- `ActionListener`
--- `ActionEvent#getSource()`でイベント元の`JRadioButton`が取得可能
--- デフォルトの`JRadioButton`は、`ActionEvent#getActionCommand()`で`JRadioButton#getText()`と同じ値を返す
--- `JRadioButton#setSelected(...)`メソッドなどを使用して`JRadioButton`の状態を変更しても、`ActionEvent`は発生しない

* 参考リンク [#reference]
- [https://stackoverflow.com/questions/9882845/jcheckbox-actionlistener-and-itemlistener java - JCheckbox - ActionListener and ItemListener? - Stack Overflow]

* コメント [#comment]
#comment
#comment