TITLE:JComboBoxの文字色を変更する
#navi(../)
RIGHT:Posted by [[aterai]] at 2011-02-14
*JComboBoxの文字色を変更する [#v4a48c3a]
JComboBoxの文字色を変更します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TVjIM1AMFkI/AAAAAAAAA1M/BSd3As9dxZE/s800/ComboBoxForegroundColor.png)

**サンプルコード [#f2e9b786]
#code{{
class ComboForegroundRenderer extends DefaultListCellRenderer {
  private final Color selectionBackground = new Color(240,245,250);
  private final JComboBox combo;
  public ComboForegroundRenderer(JComboBox combo) {
    this.combo = combo;
  }
  public Component getListCellRendererComponent(
                          JList list, Object value, int index,
                          boolean isSelected, boolean hasFocus) {
    ColorItem item = (ColorItem) value;
    if(index<0 && item!=null && item.color!=null
               && !item.color.equals(combo.getForeground())) {
      combo.setForeground(item.color); //Windows XP
      list.setSelectionForeground(item.color);
      list.setSelectionBackground(selectionBackground);
    }
    JLabel l = (JLabel)super.getListCellRendererComponent(
      list, item.description, index, isSelected, hasFocus);
    l.setForeground(item.color);
    l.setBackground(isSelected?selectionBackground:list.getBackground());
    //l.setText(item.description);
    return l;
  }
}
}}

**解説 [#x50dce7e]
上記のサンプルでは、編集不可になっているJComboBoxの文字色を、選択中のアイテムから取得した色に変更するようなセルレンダラを設定しています。
-Default:
--セルレンダラはデフォルト
-setForeground:
--ListCellRendererでJListの選択時文字色(JList#setSelectionForeground)、選択時背景色(JList#setSelectionBackground)を変更
--XPStyle.getXP()!=null の場合、フィールド部分の非選択時文字色は、JComboBoxの文字色(getForeground())が使用されるため、セルレンダラで、JComboBox#setForeground(Color) を使用
-html tag:
--選択時背景色は、「setForeground:」と同様に、JList#setSelectionBackgroundを使用
--セルレンダラで文字色をHtmlタグで変更
#code{{
private static class ComboHtmlRenderer extends DefaultListCellRenderer {
  private final Color selectionBackground = new Color(240,245,250);
  public Component getListCellRendererComponent(
                          JList list, Object value, int index,
                          boolean isSelected, boolean hasFocus) {
    ColorItem item = (ColorItem) value;
    if(index<0) {
      list.setSelectionBackground(selectionBackground);
    }
    JLabel l = (JLabel)super.getListCellRendererComponent(
      list, value, index, isSelected, hasFocus);
    l.setText("<html><font color="+hex(item.color)+">"+item.description);
    l.setBackground(isSelected?selectionBackground:list.getBackground());
    return l;
  }
  private static String hex(Color c) {
    return String.format("#%06x", c.getRGB()&0xffffff);
  }
}
}}

**参考リンク [#h54da1c1]
-[[JComboBoxの色を変更>Swing/ColorComboBox]]

**コメント [#ea073c97]
#comment