概要

JComboBoxItemの選択が、上下のカーソルキーでループするように設定します。

サンプルコード

Action up = new AbstractAction() {
  @Override public void actionPerformed(ActionEvent e) {
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    int i = c.getSelectedIndex();
    int size = c.getItemCount();
    c.setSelectedIndex((i - 1 + size) % size);
  }
};
Action down = new AbstractAction() {
  @Override public void actionPerformed(ActionEvent e) {
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    int i = c.getSelectedIndex();
    int size = c.getItemCount();
    c.setSelectedIndex((i + 1) % size);
  }
};
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");
View in GitHub: Java, Kotlin

解説

  • default
    • 例えば最後のアイテムが選択されている状態で下カーソルキーを入力しても選択状態は変化しない
  • loop
    • loopUp: 先頭のアイテムが選択されている状態で上カーソルキーを入力すると末尾のアイテムを選択するActionを作成
    • loopDown: 末尾のアイテムが選択されている状態で下カーソルキーを入力すると先頭のアイテムを選択するActionを作成
    • JComboBoxからActionMapInputMapを取得しこれに上下カーソルキーに対応する新しいActionを追加して選択のループを可能に設定

参考リンク

コメント