JComboBoxの色を変更
Total: 20754
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JComboBox
のEditor
部分と、List
部分の色を変更します。
Screenshot
Advertisement
サンプルコード
class AlternateRowColorComboBox<E> extends JComboBox<E> {
private static final Color EVEN_BGC = new Color(0xE1_FF_E1);
private static final Color ODD_BGC = Color.WHITE;
private transient ItemListener itemColorListener;
protected AlternateRowColorComboBox(ComboBoxModel<E> model) {
super(model);
}
@Override public void setEditable(boolean flag) {
super.setEditable(flag);
Component field = getEditor().getEditorComponent();
if (flag && field instanceof JComponent) {
((JComponent) field).setOpaque(true);
field.setBackground(getAlternateRowColor(getSelectedIndex()));
}
}
@Override public void updateUI() {
removeItemListener(itemColorListener);
super.updateUI();
ListCellRenderer<? super E> r = getRenderer();
setRenderer((list, value, index, isSelected, cellHasFocus) -> {
Component c = r.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (index >= 0 && c instanceof JComponent) {
((JComponent) c).setOpaque(true);
}
if (!isSelected) {
c.setBackground(getAlternateRowColor(index));
}
return c;
});
itemColorListener = e -> {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
JComboBox<?> cb = (JComboBox<?>) e.getItemSelectable();
Color rc = getAlternateRowColor(cb.getSelectedIndex());
if (cb.isEditable()) {
cb.getEditor().getEditorComponent().setBackground(rc);
} else {
cb.setBackground(rc);
}
};
addItemListener(itemColorListener);
EventQueue.invokeLater(() -> {
Component c = getEditor().getEditorComponent();
c.setBackground(getAlternateRowColor(getSelectedIndex()));
if (c instanceof JComponent) {
((JComponent) c).setOpaque(true);
}
});
}
protected static Color getAlternateRowColor(int index) {
return index % 2 == 0 ? EVEN_BGC : ODD_BGC;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JComboBox
を編集可にした状態で以下のようにList
部分、Editor
部分に行の奇数偶数で背景色を変更しています。
List
部分ListCellRenderer
を使用することで背景色を変更
Editor
部分getEditor().getEditorComponent()
でJTextField
オブジェクトを取得して背景色を変更
GTKLookAndFeel
などでBox
(Editor
)部分の色を変更できない場合がある