Swing/ComboBoxSelectNextPrevious のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComboBoxSelectNextPrevious へ行く。
- 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ごとに異なるのでこれを統一します。
Screenshot

Advertisement
サンプルコード
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解説
MetalLookAndFeel
、MotifLookAndFeel
- デフォルトは↓(
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();
}
}
}
}