• category: swing folder: ComboBoxSelectNextPrevious title: JComboBoxの上下矢印キーによる選択移動アクションを変更する tags: [JComboBox, LookAndFeel] author: aterai pubdate: 2024-06-24T00:29:41+09:00 description: JComboBoxの上下矢印キーによる選択上下移動アクションがLookAndFeelごとに異なるのでこれを統一します。 image: https://drive.google.com/uc?id=17ce0OSRkHHvvMyxaQhIwckLzwHYcA5Ll

概要

JComboBoxの上下矢印キーによる選択上下移動アクションがLookAndFeelごとに異なるのでこれを統一します。

サンプルコード

JComboBox<LookAndFeelInfo> combo = new LookAndFeelComboBox(model) {
  @Override public void updateUI() {
    super.updateUI();
    String name = getUI().getClass().getName();
    if (name.contains("MetalComboBoxUI") || name.contains("MotifComboBoxUI")) {
      InputMap im = getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
      im.put(KeyStroke.getKeyStroke("DOWN"), "selectNext2");
      im.put(KeyStroke.getKeyStroke("UP"), "selectPrevious2");
    }
  }
};
View in GitHub: Java, Kotlin

解説

  • MetalLookAndFeelMotifLookAndFeel
    • デフォルトは(DOWN)キーにselectNextアクション、(UP)キーにselectPreviousアクションが割り当てられている
    • selectNextアクションはドロップダウンリストが表示されている場合は下のアイテムに選択を移動、非表示の場合はドロップダウンリストを開く(選択状態は変化しない)
    • JComboBoxのドロップダウンリストを上矢印キーでも開くよう設定する
// @see javax/swing/plaf/basic/BasicComboBoxUI.java
else if (key == DOWN) {
  if (comboBox.isShowing() ) {
    if (comboBox.isPopupVisible()) {
      if (ui != null) {
        ui.selectNextPossibleValue();
      }
    } else {
      comboBox.setPopupVisible(true);
    }
  }
}

- `BasicLookAndFeel`、`WindowsLookAndFeel`、`NimbusLookAndFeel`
-- デフォルトはKBD{↓}(`DOWN`)キーに`selectNext2`アクション、KBD{↑}(`UP`)キーに`selectPrevious2`アクションが割り当てられている
-- `selectNext2`、`selectPrevious2`アクションではドロップダウンリストは開かずに選択アイテム移動が可能
--- `MetalLookAndFeel`、`MotifLookAndFeel`でも編集可能な`JComboBox`や`JTable`のセルエディタとなる`JComboBox`の場合は`selectNext2`、`selectPrevious2`アクションが使用される
-- 上記のサンプル右側の`JComboBox`では`MetalLookAndFeel`、`MotifLookAndFeel`の場合も`InputMap#put(KeyStroke.getKeyStroke("DOWN"), "selectNext2")`などで上下矢印キーで`selectNext2`、`selectPrevious2`アクションを使用するよう変更
--- このため選択された`LookAndFeel`への`UIManager.setLookAndFeel(lookAndFeelName)`での切り替えがドロップダウンリストを開かずに上下矢印キーのみで可能になる

#code{{
// @see javax/swing/plaf/basic/BasicComboBoxUI.java
else if (key == DOWN_2) {
  // Special case in which pressing the arrow keys will not
  // make the popup appear - except for editable combo boxes
  // and combo boxes inside a table.
  if (comboBox.isShowing()) {
    if ((comboBox.isEditable() || (ui != null && ui.isTableCellEditor()))
        && !comboBox.isPopupVisible()) {
      comboBox.setPopupVisible(true);
    } else {
      if (ui != null) {
        ui.selectNextPossibleValue();
      }
    }
  }
}

参考リンク

コメント