Swing/ComboBoxSelectNextPrevious の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ComboBoxSelectNextPrevious へ行く。
- Swing/ComboBoxSelectNextPrevious の差分を削除
--- category: swing folder: ComboBoxSelectNextPrevious title: JComboBoxの上下矢印キーによる選択移動アクションを変更する tags: [JComboBox, LookAndFeel] tags: [JComboBox, LookAndFeel, InputMap] author: aterai pubdate: 2024-06-24T00:29:41+09:00 description: JComboBoxの上下矢印キーによる選択上下移動アクションがLookAndFeelごとに異なるのでこれを統一します。 image: https://drive.google.com/uc?id=17ce0OSRkHHvvMyxaQhIwckLzwHYcA5Ll --- * 概要 [#summary] `JComboBox`の上下矢印キーによる選択上下移動アクションが`LookAndFeel`ごとに異なるのでこれを統一します。 #download(https://drive.google.com/uc?id=17ce0OSRkHHvvMyxaQhIwckLzwHYcA5Ll) * サンプルコード [#sourcecode] #code(link){{ 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"); } } }; }} * 解説 [#explanation] - `MetalLookAndFeel`、`MotifLookAndFeel` -- デフォルトはKBD{↓}(`DOWN`)キーに`selectNext`アクション、KBD{↑}(`UP`)キーに`selectPrevious`アクションが割り当てられている -- `selectNext`アクションはドロップダウンリストが表示されている場合は下のアイテムに選択を移動、非表示の場合はドロップダウンリストを開く(選択状態は変化しない) -- [[JComboBoxのドロップダウンリストを上矢印キーでも開くよう設定する>Swing/ShowPopupOnNavigation]] #code{{ // @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`アクションではドロップダウンリストは開かずに選択アイテム移動が可能 --- 編集可能な`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(); } } } } }} * 参考リンク [#reference] - [[JComboBoxのドロップダウンリストを上矢印キーでも開くよう設定する>Swing/ShowPopupOnNavigation]] - [[LookAndFeelの一覧を取得する>Swing/InstalledLookAndFeels]] * コメント [#comment] #comment #comment