Swing/KeySelectionManager のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/KeySelectionManager へ行く。
- 1 (2018-08-27 (月) 16:15:10)
- 2 (2020-08-19 (水) 13:28:41)
- 3 (2022-01-15 (土) 15:19:21)
- category: swing folder: KeySelectionManager title: JComboBoxでキー入力による項目選択を無効にする tags: [JComboBox] author: aterai pubdate: 2018-08-27T16:10:35+09:00 description: JComboBoxのドロップダウンリストで項目の先頭文字などがキー入力と一致する場合の項目選択を無効にします。 image: https://drive.google.com/uc?id=114_GR1TDfMUrd7kaOi0H3VyK1g_fTZ60sQ
概要
JComboBox
のドロップダウンリストで項目の先頭文字などがキー入力と一致する場合の項目選択を無効にします。
Screenshot
Advertisement
サンプルコード
JComboBox<String> combo1 = new JComboBox<String>(makeModel()) {
@Override public boolean selectWithKeyChar(char keyChar) {
return false;
}
};
JComboBox<String> combo2 = new JComboBox<>(makeModel());
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
のデフォルトKeySelectionManager
は、BasicComboBoxUI#DefaultKeySelectionManager
- 内部で
JList#getNextMatch(...)
メソッドを使用している
- 内部で
JComboBox#DefaultKeySelectionManager
も存在するが、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() { ^