• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*JComboBoxのItem選択をループ [#t1a92582]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-10-24~
更新日:&lastmod;
---
category: swing
folder: LoopComboBox
title: JComboBoxのItem選択をループ
tags: [JComboBox, ActionMap, InputMap]
author: aterai
pubdate: 2005-10-24T09:40:47+09:00
description: JComboBoxのItemの選択が、上下のカーソルキーでループするように設定します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPicRK7pI/AAAAAAAAAeI/ApRsPHlRWe0/s800/LoopComboBox.png
---
* 概要 [#summary]
`JComboBox`の`Item`の選択が、上下のカーソルキーでループするように設定します。

#contents
**概要 [#s7ceec84]
JComboBoxのItemの選択が、上下のカーソルキーでループするように設定します。
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPicRK7pI/AAAAAAAAAeI/ApRsPHlRWe0/s800/LoopComboBox.png)

//http://terai.xrea.jp/swing/loopcombobox/screenshot.png
* サンプルコード [#sourcecode]
#code(link){{
Action up = new AbstractAction() {
  @Override public void actionPerformed(ActionEvent e) {
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    int i = c.getSelectedIndex();
    c.setSelectedIndex(i == 0 ? c.getItemCount() - 1 : i - 1);
  }
};
Action down = new AbstractAction() {
  @Override public void actionPerformed(ActionEvent e) {
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    int i = c.getSelectedIndex();
    c.setSelectedIndex(i == c.getItemCount() - 1 ? 0 : i + 1);
  }
};
ActionMap am = combo.getActionMap();
am.put("loopUp", up);
am.put("loopDown", down);
InputMap im = combo.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "loopUp");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "loopDown");
}}

**サンプルコード [#b3f4d4b8]
 Action up = new AbstractAction() {
   public void actionPerformed(ActionEvent e) {
     int index = combo.getSelectedIndex();
     combo.setSelectedIndex((index==0)?combo.getItemCount()-1:index-1);
   }
 };
 Action down = new AbstractAction() {
   public void actionPerformed(ActionEvent e) {
     int index = combo.getSelectedIndex();
     combo.setSelectedIndex((index==combo.getItemCount()-1)?0:index+1);
   }
 };
 ActionMap amc = combo.getActionMap();
 amc.put("myUp",   up);
 amc.put("myDown", down);
 InputMap imc = combo.getInputMap();
 imc.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0),   "myUp");
 imc.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "myDown");
* 解説 [#explanation]
- `default`
-- 例えば最後のアイテムが選択されている状態で下カーソルキーを入力しても選択状態は変化しない
- `loop`
-- `loopUp`: 先頭のアイテムが選択されている状態で上カーソルキーを入力すると末尾のアイテムを選択する`Action`を作成
-- `loopDown`: 末尾のアイテムが選択されている状態で下カーソルキーを入力すると先頭のアイテムを選択する`Action`を作成
-- `JComboBox`から`ActionMap`と`InputMap`を取得しこれに上下カーソルキーに対応する新しい`Action`を追加して選択のループを可能に設定

-[[サンプルを起動>http://terai.xrea.jp/swing/loopcombobox/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/loopcombobox/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/loopcombobox/src.zip]]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/ActionMap.html ActionMap (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/InputMap.html InputMap (Java Platform SE 8)]

**解説 [#d842f217]
上記のサンプルでは、下のコンボボックスのActionMapとInputMapを使って、上下キーに対応する新しいアクションを設定しています。

//**参考リンク
**コメント [#fd90efef]
- fsadf -- [[fas]] &new{2005-11-13 (日) 11:00:49};
- fsadf -- [[fas]] &new{2005-11-13 (日) 11:01:13};

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