Swing/ColorComboBox のバックアップの現在との差分(No.10)
TITLE:JComboBoxの色を変更
JComboBoxの色を変更
編集者:Terai Atsuhiro~
作成日:2005-01-10
更新日:2021-11-17 (水) 04:12:37
- category: swing folder: ColorComboBox title: JComboBoxの色を変更 tags: [JComboBox, ListCellRenderer, JTextField] author: aterai pubdate: 2005-01-10T01:48:08+09:00 description: JComboBoxのEditor部分と、List部分の色を変更します。 image: hreflang:
href: https://java-swing-tips.blogspot.com/2009/06/color-jcombobox.html lang: en
概要
JComboBox
のEditor
部分と、List
部分の色を変更します。
Screenshot
Advertisement
概要
JComboBoxのEditor部分と、List部分の色を変更します。サンプルコード
#spanend
#spanadd
class AlternateRowColorComboBox<E> extends JComboBox<E> {
#spanend
private static final Color EVEN_BGC = new Color(0xE1_FF_E1);
private static final Color ODD_BGC = Color.WHITE;
private transient ItemListener itemColorListener;
#spandel
#screenshot
#spanend
protected AlternateRowColorComboBox(ComboBoxModel<E> model) {
super(model);
}
#spandel
**サンプルコード [#b2f19a3d]
#spanend
combo01.setModel(makeModel());
combo01.setRenderer(new MyListCellRenderer(combo01.getRenderer()));
combo01.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()!=ItemEvent.SELECTED) return;
combo01.setBackground(getOEColor(combo01.getSelectedIndex()));
}
});
combo01.setSelectedIndex(0);
combo01.setBackground(evenBGColor);
final JTextField field = (JTextField) combo02.getEditor().getEditorComponent();
field.setOpaque(true);
field.setBackground(evenBGColor);
combo02.setEditable(true);
combo02.setModel(makeModel());
combo02.setRenderer(new MyListCellRenderer(combo02.getRenderer()));
combo02.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()!=ItemEvent.SELECTED) return;
field.setBackground(getOEColor(combo02.getSelectedIndex()));
}
});
combo02.setSelectedIndex(0);
@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);
}
});
}
-&jnlp;
-&jar;
-&zip;
protected static Color getAlternateRowColor(int index) {
return index % 2 == 0 ? EVEN_BGC : ODD_BGC;
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
JComboBoxを編集可にした状態で、以下のようにList部分、Editor部分に背景色を設定します。解説
上記のサンプルでは、JComboBox
を編集可にした状態で以下のようにList
部分、Editor
部分に行の奇数偶数で背景色を変更しています。
- List部分
- ListCellRendererを使用することで背景色を変更しています。
-
List
部分-
ListCellRenderer
を使用することで背景色を変更
-
-
Editor
部分-
getEditor().getEditorComponent()
でJTextField
オブジェクトを取得して背景色を変更
-
- Editor部分
- getEditor().getEditorComponent()でJTextFieldオブジェクトを取得して背景色を変更しています。
- -
- getEditor().getEditorComponent()でJTextFieldオブジェクトを取得して背景色を変更しています。
-
GTKLookAndFeel
などでBox
(Editor
)部分の色を変更できない場合がある
コメント
- JComboBox#setEditable(true)は必須のようです。編集不可にするにはEditor部分のJTextFieldに対してsetEditable(false) -- Y?
- ご指摘ありがとうございます。せっかくJComboBoxを上下に並べているのだから、編集可の場合と不可の場合のサンプルにすればよかったですね。編集不可の場合(JComboBox#setEditable(false))に色を着けるには、上記の方法と、以下のようにJComboBox#setBackground(Color)メソッドを使う方法があるようです。編集不可の場合は、この部分の色もレンダラーが勝手にやってくれてたような気がするのですが、勘違いだったのかも。 -- terai
combo01.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if(e.getStateChange()!=ItemEvent.SELECTED) return; combo01.setBackground((combo01.getSelectedIndex()%2==0)?evenBGColor:oddBGColor); } });
- せっかくなので、上のJComboBoxは編集不可、下は編集可の場合で、色を着けるサンプルに変更しました。 -- terai
- ご指摘ありがとうございます。せっかくJComboBoxを上下に並べているのだから、編集可の場合と不可の場合のサンプルにすればよかったですね。編集不可の場合(JComboBox#setEditable(false))に色を着けるには、上記の方法と、以下のようにJComboBox#setBackground(Color)メソッドを使う方法があるようです。編集不可の場合は、この部分の色もレンダラーが勝手にやってくれてたような気がするのですが、勘違いだったのかも。 -- terai