Swing/ComboBoxSelectionBackground のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComboBoxSelectionBackground へ行く。
- category: swing folder: ComboBoxSelectionBackground title: JComboBoxのドロップダウンリストでの選択背景色を変更する tags: [JComboBox, JList, UIManager] author: aterai pubdate: 2017-09-18T18:34:08+09:00 description: JComboBoxのドロップダウンリストで使用されるJListの選択背景色と選択文字色を変更します。 image: https://drive.google.com/uc?id=1j4KzCS-He6w9JuyRopBvRfEgr3S-XgXxrA
概要
JComboBox
のドロップダウンリストで使用されるJList
の選択背景色と選択文字色を変更します。
Screenshot
Advertisement
サンプルコード
UIManager.put("ComboBox.selectionBackground", Color.PINK);
UIManager.put("ComboBox.selectionForeground", Color.CYAN);
String[] model = {"111", "2222", "33333"};
JComboBox<String> combo0 = new JComboBox<>(model);
JComboBox<String> combo1 = new JComboBox<String>(model) {
@Override public void updateUI() {
super.updateUI();
Object o = getAccessibleContext().getAccessibleChild(0);
if (o instanceof ComboPopup) {
JList list = ((ComboPopup) o).getList();
list.setSelectionForeground(Color.WHITE);
list.setSelectionBackground(Color.ORANGE);
}
}
};
JComboBox<String> combo2 = new JComboBox<String>(model) {
@Override public void updateUI() {
super.updateUI();
setRenderer(new DefaultListCellRenderer() {
@Override public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean hasFocus) {
JLabel l = (JLabel) super.getListCellRendererComponent(
list, value, index, isSelected, hasFocus);
if (isSelected) {
l.setForeground(Color.WHITE);
l.setBackground(Color.ORANGE);
} else {
l.setForeground(Color.BLACK);
l.setBackground(Color.WHITE);
}
return l;
}
});
}
};
View in GitHub: Java, Kotlin解説
UIManager.put(ComboBox.selection*, ...)
UIManager.put("ComboBox.selectionBackground", bgc);
、UIManager.put("ComboBox.selectionForeground", fgc);
を使用してJList
の選択背景色と選択文字色を変更- ドロップダウンリストで使用される
JList
のみが対象 LookAndFeel
に依存し、例えばNimbusLookAndFeel
ではどちらの指定も無効
ComboPopup.getList().setSelection*(...)
JComboBox#getAccessibleContext()#getAccessibleChild(0)
でComboPopup
を取得ComboPopup#getList()
メソッドでドロップダウンリストで使用されるJList
を取得JList#setSelectionForeground(...)
、JList#setSelectionBackground(...)
メソッドを使用してその選択背景色と選択文字色を変更MetalLookAndFeel
で編集不可のJComboBox
の場合、JComboBox
本体の選択背景色も変更される
DefaultListCellRenderer
- 参考: JComboBoxの文字色を変更する
DefaultListCellRenderer#getListCellRendererComponent(...)
メソッドをオーバーライドして選択背景色と選択文字色を変更MetalLookAndFeel
で編集不可のJComboBox
の場合、JComboBox
本体の選択背景色は変更されない- このサンプルの場合、ドロップダウンリストの選択背景色に設定したオレンジ色ではなく
UIManager.put("ComboBox.selectionBackground", Color.PINK)
で設定したピンク色になる
- このサンプルの場合、ドロップダウンリストの選択背景色に設定したオレンジ色ではなく
JComboBox
本体のフォーカス時のBorder
(WindowsLookAndFeel
の場合はWindowsBorders.DashedBorder
)が非表示になる- 回避方法: セルの描画を
DefaultListCellRenderer
を継承するレンダラーではなく、JComboBox#getRenderer()
で取得したLookAndFeel
のデフォルトセルレンダラーに移譲するなどの方法があるJComboBox<String> combo3 = new JComboBox<String>(model) { @Override public void updateUI() { setRenderer(null); super.updateUI(); ListCellRenderer<? super String> defaultRenderer = getRenderer(); setRenderer(new ListCellRenderer<String>() { @Override public Component getListCellRendererComponent( JList<? extends String> list, String value, int index, boolean isSelected, boolean hasFocus) { JLabel l = (JLabel) defaultRenderer.getListCellRendererComponent( list, value, index, isSelected, hasFocus); if (isSelected) { l.setForeground(Color.WHITE); l.setBackground(Color.ORANGE); } else { l.setForeground(Color.BLACK); l.setBackground(Color.WHITE); } return l; } }); } };
- 回避方法: セルの描画を