JComboBoxの色を変更
Total: 17232
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JComboBox
のEditor
部分と、List
部分の色を変更します。
サンプルコード
class AlternateRowColorComboBox<E> extends JComboBox<E> {
private static final Color EVEN_BGCOLOR = new Color(225, 255, 225);
private static final Color ODD_BGCOLOR = new Color(255, 255, 255);
private transient ItemListener itemColorListener;
public AlternateRowColorComboBox() {
super();
}
public AlternateRowColorComboBox(ComboBoxModel<E> aModel) {
super(aModel);
}
public AlternateRowColorComboBox(E[] items) {
super(items);
}
@Override public void setEditable(boolean aFlag) {
super.setEditable(aFlag);
if (aFlag) {
JTextField field = (JTextField) getEditor().getEditorComponent();
field.setOpaque(true);
field.setBackground(getAlternateRowColor(getSelectedIndex()));
}
}
@Override public void updateUI() {
removeItemListener(itemColorListener);
super.updateUI();
setRenderer(new DefaultListCellRenderer() {
@Override public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel c = (JLabel) super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
c.setOpaque(true);
if (!isSelected) {
c.setBackground(getAlternateRowColor(index));
}
return c;
}
});
if (itemColorListener == null) {
itemColorListener = new ItemListener() {
@Override public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
JComboBox cb = (JComboBox) e.getItemSelectable();
Color rc = getAlternateRowColor(cb.getSelectedIndex());
if (cb.isEditable()) {
JTextField field = (JTextField) cb.getEditor().getEditorComponent();
field.setBackground(rc);
} else {
cb.setBackground(rc);
}
}
};
}
addItemListener(itemColorListener);
JTextField field = (JTextField) getEditor().getEditorComponent();
if (field != null) {
field.setOpaque(true);
field.setBackground(getAlternateRowColor(getSelectedIndex()));
}
}
private static Color getAlternateRowColor(int index) {
return (index % 2 == 0) ? EVEN_BGCOLOR : ODD_BGCOLOR;
}
}
view all解説
上記のサンプルでは、JComboBox
を編集可にした状態で、以下のようにList
部分、Editor
部分に行の奇数偶数で背景色を変更しています。
List
部分ListCellRenderer
を使用することで背景色を変更
Editor
部分getEditor().getEditorComponent()
でJTextField
オブジェクトを取得して背景色を変更
GTKLookAndFeel
などでBox
(Editor
)部分の色を変更できない場合がある