概要

JComboBoxのドロップダウンリストで項目の先頭文字などがキー入力と一致する場合の項目選択を無効にします。

サンプルコード

JComboBox<String> combo1 = new JComboBox<String>(makeModel()) {
  @Override public boolean selectWithKeyChar(char keyChar) {
    return false;
  }
};

JComboBox<String> combo2 = new JComboBox<>(makeModel());
combo2.setKeySelectionManager((key, model) -> -1);
// combo2.setKeySelectionManager(new JComboBox.KeySelectionManager() {
//   // Java 10: @Override public int selectionForKey(char key, ComboBoxModel<?> model) {
//   @Override public int selectionForKey(char key, ComboBoxModel model) { // Java 9
//     return -1;
//   }
// });
View in GitHub: Java, Kotlin

解説

  • BasicComboBoxUI#DefaultKeySelectionManager
    • 編集不可に設定されたJComboBoxのデフォルトKeySelectionManagerBasicComboBoxUI#DefaultKeySelectionManager
      • 内部でJList#getNextMatch(...)メソッドを使用している
    • JComboBox#DefaultKeySelectionManagerも存在するがJList#getNextMatch(...)を使用していない、UIManager.get("ComboBox.timeFactor")などが無効で二文字目以降の入力が無効などの制限があり、BasicComboBoxUI#DefaultKeySelectionManagerより低機能?
      • JList#getNextMatch(...)を使用していない、UIManager.get("ComboBox.timeFactor")などが無効で二文字目以降の入力が無効など
    • 編集可能なJComboBoxで入力した文字列をドロップダウンリスト中での選択項目に設定する場合はKeySelectionManagerを使用できないので別途PopupMenuListenerなどを使って自前で選択を変更する必要がある
  • disable JComboBox#selectWithKeyChar(...)
    • JComboBox#selectWithKeyChar(...)をオーバーライドしてキー入力による項目選択を無効化
      • JComboBox#setKeySelectionManager(null)を設定してもJComboBox#selectWithKeyChar(...)内でJComboBox#DefaultKeySelectionManagerが復元されてしまうので、オーバーライドして常にfalseを返すよう設定
  • disable KeySelectionManager#selectionForKey(...)
    • KeySelectionManager#selectionForKey(...)をオーバーライドしてキー入力による項目選択を無効化
    • Java 9@Override public int selectionForKey(char key, ComboBoxModel<?> model) {のようにオーバーライドすると以下のようなエラーになる
      エラー: <anonymous example.MainPanel$2>はabstractでなく、KeySelectionManager内のabstractメソッドselectionForKey(char,ComboBoxModel)をオーバーライドしません
              combo3.setKeySelectionManager(new JComboBox.KeySelectionManager() {
                                                                                ^

参考リンク

コメント