• 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

概要

JComboBoxJCheckBoxなどに設定したItemListenerActionListenerの動作を比較テストします。

サンプルコード

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);
});
View in GitHub: Java, Kotlin

解説

JComboBox

  • ItemListener
    • ItemEvent#getItemSelectable()でイベント元のJComboBoxが取得可能
    • ItemEvent#getItem()JComboBoxで選択されたアイテムが取得可能
    • ItemEvent#getStateChange()JComboBoxのアイテムが選択、選択解除されたかを取得可能
    • JComboBox#setSelectedIndex(...)メソッドなどを使用してJComboBoxを直接マウスやキー入力で操作しなくても、ItemEventは発生する
    • JComboBox#setSelectedIndex(...)メソッドなどを使用してJComboBoxを直接マウスやキー入力で操作しなくてもItemEventは発生する
    • JComboBoxの同じアイテムを選択してもItemEventは発生しない
  • ActionListener
    • ActionEvent#getSource()でイベント元のJComboBoxが取得可能
    • デフォルトのJComboBoxは、ActionEvent#getActionCommand()"comboBoxChanged"を返す
    • デフォルトのJComboBoxActionEvent#getActionCommand()comboBoxChangedを返す
    • JComboBox#setSelectedIndex(...)メソッドなどを使用してJComboBoxを直接マウスやキー入力で操作しなくても、ActionEventは発生する
    • JComboBoxの同じアイテムを選択してもActionEventは発生する

JCheckBox

  • ItemListener
    • ItemEvent#getItemSelectable()、またはItemEvent#getItem()でイベント元のJCheckBoxが取得可能
    • ItemEvent#getStateChange()JCheckBoxが選択されたかを取得可能
    • JCheckBox#setSelected(...)メソッドなどを使用してJCheckBoxを直接マウスやキー入力で操作しなくても、ItemEventは発生する
    • JCheckBox#setSelected(...)メソッドなどを使用してJCheckBoxを直接マウスやキー入力で操作しなくてもItemEventは発生する
    • JCheckBox#setSelected(...)メソッドを使用しても選択状態が変化しない場合、ItemEventは発生しない
  • ActionListener
    • ActionEvent#getSource()でイベント元のJCheckBoxが取得可能
    • デフォルトのJCheckBoxは、ActionEvent#getActionCommand()JCheckBox#getText()と同じ値を返す
    • デフォルトのJCheckBoxActionEvent#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を返す
    • ButtonGroup#getSelection()JRadioButton#setSelected(...)メソッドを使用して選択変更した場合はnull、マウスなどで選択変更した場合はそのButtonModelを返す
  • ActionListener
    • ActionEvent#getSource()でイベント元のJRadioButtonが取得可能
    • デフォルトのJRadioButtonは、ActionEvent#getActionCommand()JRadioButton#getText()と同じ値を返す
    • JRadioButton#setSelected(...)メソッドなどを使用してJRadioButtonの状態を変更しても、ActionEventは発生しない
    • デフォルトのJRadioButtonActionEvent#getActionCommand()JRadioButton#getText()と同じ値を返す
    • JRadioButton#setSelected(...)メソッドなどを使用してJRadioButtonの状態を変更してもActionEventは発生しない

参考リンク

コメント