• category: swing folder: ItemSelectableSelectedObjects title: ItemListenerからItemSelectableを実装するコンポーネントを取得する tags: [ItemListener, JComboBox, JCheckBox, JRadioButton] author: aterai pubdate: 2024-07-29T02:16:27+09:00 description: ItemListenerからこれを設定したItemSelectableを実装する元コンポーネントや、選択アイテムなどを取得するテストを実行します。 image: https://drive.google.com/uc?id=1NfhtYz1TlJhjNGAZQovpF0t31QE61POZ

概要

ItemListenerからこれを設定したItemSelectableを実装する元コンポーネントや、選択アイテムなどを取得するテストを実行します。

サンプルコード

ItemListener listener = e -> {
  Object item = e.getItem();
  ItemSelectable selectable = e.getItemSelectable();
  Object[] objects = selectable.getSelectedObjects();
  if (e.getStateChange() == ItemEvent.SELECTED) {
    log.append("Item: " + item + "\n");
    log.append("ItemSelectable: " + selectable.getClass().getName() + "\n");
  }
  log.append("SelectedObjects:");
  if (objects != null) {
    Arrays.stream(objects).forEach(o -> {
      String str = Objects.toString(o);
      if (o instanceof AbstractButton) {
        str = ((AbstractButton) o).getText();
      }
      log.append(" " + str);
    });
  }
  log.append("\n----\n");
};
View in GitHub: Java, Kotlin

解説

  • ItemEvent#getItem()
    • 選択状態が変化したアイテムを返す
    • JRadioButtonJCheckBoxJToggleButtonなどのAbstractButtonではイベント発生元のコンポーネント自体(ItemEvent#getItemSelectable()と同じ)が返される
    • JComboBoxではComboBoxModel#getSelectedItem()で取得可能なアイテムが返される
  • ItemEvent (Java Platform SE 8 )
    • イベント発生元のItemSelectableコンポーネントオブジェクトを返す
    • EventObject#getSource()で取得可能なオブジェクトと同一
  • ItemSelectable#getSelectedObjects()
    • 選択されたアイテム、またはアイテムが選択されていない場合はnullを返す
    • ItemSelectableを実装するコンポーネントで複数選択可能なのはjava.awt.Listのみ?なので、それ以外のコンポーネントではItemEvent#getItem()で取得可能なアイテムひとつのオブジェクト配列が返される
      • javax.swing.JListItemSelectableを実装せず、ItemListenerは利用不可
    • ButtonGroupに追加したJRadioButtonでも選択可能なボタンはひとつのみなので複数選択アイテムが返されることはない
    • 上記のサンプルでは同一の親JPanelに配置されたJCheckBoxを検索して選択状態のボタン配列を返すようJCheckBox#getSelectedObjects()をオーバーライド
    • JComboBoxのアイテムとして表示したJCheckBoxを複数選択するを利用してJComboBoxを複数選択可能に変更し、選択アイテムをオブジェクト配列として返すようJCheckBox#getSelectedObjects()をオーバーライド
      • アイテムが選択されていない場合はnullではなく空配列を返すよう変更
@Override public Object[] getSelectedObjects() {
  ListModel<E> model = getModel();
  return IntStream.range(0, model.getSize())
      .mapToObj(model::getElementAt)
      .filter(CheckItem::isSelected)
      .toArray();
}

参考リンク

コメント