• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JComboBoxの文字色を変更する
#navi(../)
#tags(JComboBox, ListCellRenderer, Html)
RIGHT:Posted by &author(aterai); at 2011-02-14
* JComboBoxの文字色を変更する [#v4a48c3a]
`JComboBox`の文字色を変更します。
---
category: swing
folder: ComboBoxForegroundColor
title: JComboBoxの文字色を変更する
tags: [JComboBox, ListCellRenderer, Html]
author: aterai
pubdate: 2011-02-14T15:46:36+09:00
description: JComboBoxに選択中のセルアイテム文字色を変更するセルレンダラーを設定します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TVjIM1AMFkI/AAAAAAAAA1M/BSd3As9dxZE/s800/ComboBoxForegroundColor.png
---
* 概要 [#summary]
`JComboBox`に選択中のセルアイテム文字色を変更するセルレンダラーを設定します。

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

** サンプルコード [#f2e9b786]
* サンプルコード [#sourcecode]
#code(link){{
class ComboForegroundRenderer extends DefaultListCellRenderer {
  private final Color selectionBackground = new Color(240,245,250);
  private static final Color SELECTION_BACKGROUND = new Color(240, 245, 250);
  private final JComboBox combo;
  public ComboForegroundRenderer(JComboBox combo) {
    super();
    this.combo = combo;
  }
  @Override public Component getListCellRendererComponent(JList list,
      Object value, int index, boolean isSelected, boolean hasFocus) {
    if(value instanceof ColorItem) {

  @Override public Component getListCellRendererComponent(
      JList list, Object value, int index,
      boolean isSelected, boolean hasFocus) {
    if (value instanceof ColorItem) {
      ColorItem item = (ColorItem) value;
      Color ic = item.color;
      if(index<0 && ic!=null && !ic.equals(combo.getForeground())) {
      if (index < 0 && ic != null && !ic.equals(combo.getForeground())) {
        combo.setForeground(ic); //Windows, Motif Look&Feel
        list.setSelectionForeground(ic);
        list.setSelectionBackground(selectionBackground);
        list.setSelectionBackground(SELECTION_BACKGROUND);
      }
      JLabel l = (JLabel)super.getListCellRendererComponent(
      JLabel l = (JLabel) super.getListCellRendererComponent(
          list, item.description, index, isSelected, hasFocus);
      l.setForeground(ic);
      l.setBackground(isSelected?selectionBackground:list.getBackground());
      l.setBackground(isSelected ? SELECTION_BACKGROUND
                                 : list.getBackground());
      return l;
    }else{
    } else {
      super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);
      return this;
    }
  }
}
}}

** 解説 [#x50dce7e]
上記のサンプルでは、編集不可になっている`JComboBox`の文字色を、選択中のアイテムから取得した色に変更するようなセルレンダラを設定しています。
* 解説 [#explanation]
- 上: `Default`
-- デフォルトのリストセルレンダラーを使用
- 中: `setForeground`
-- `ListCellRenderer`で`JList`の選択時文字色:`JList#setSelectionForeground(...)`、選択時背景色:`JList#setSelectionBackground(...)`を変更
-- `XPStyle.getXP()!=null`な`WindowsLookAndFeel`や`MotifLookAndFeel`の場合フィールド部分の非選択時文字色は`JComboBox`の文字色:`getForeground()`が使用されるため、セルレンダラーで`JComboBox#setForeground(Color)`を使用
- 下: `Html tag`
-- 選択時背景色は上記の`setForeground`と同様に`JList#setSelectionBackground`を使用
-- セルレンダラーで文字色を`Html`タグで変更

- `Default`
-- セルレンダラはデフォルト
- `setForeground`
-- `ListCellRenderer`で`JList`の選択時文字色(`JList#setSelectionForeground`)、選択時背景色(`JList#setSelectionBackground`)を変更
-- `XPStyle.getXP()!=null`な`Windows LookAndFeel`や、`Motif LookAndFeel`の場合、フィールド部分の非選択時文字色は、`JComboBox`の文字色(`getForeground()`)が使用されるため、セルレンダラで、`JComboBox#setForeground(Color)`を使用
- `Html tag`
-- 選択時背景色は、上記の`setForeground`と同様に、`JList#setSelectionBackground`を使用
-- セルレンダラで文字色を`Html`タグで変更

#code{{
class ComboHtmlRenderer extends DefaultListCellRenderer {
  private final Color selectionBackground = new Color(240,245,250);
  @Override public Component getListCellRendererComponent(JList list,
      Object value, int index, boolean isSelected, boolean hasFocus) {
  private static final Color SELECTION_BACKGROUND = new Color(240, 245, 250);
  @Override public Component getListCellRendererComponent(
      JList list, Object value, int index,
      boolean isSelected, boolean hasFocus) {
    ColorItem item = (ColorItem) value;
    if(index<0) {
      list.setSelectionBackground(selectionBackground);
    if (index < 0) {
      list.setSelectionBackground(SELECTION_BACKGROUND);
    }
    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());
    JLabel l = (JLabel) super.getListCellRendererComponent(
        list, value, index, isSelected, hasFocus);
    l.setText("<html><font color=" + hex(item.color) + ">" + item.description);
    l.setBackground(isSelected ? SELECTION_BACKGROUND : list.getBackground());
    return l;
  }

  private static String hex(Color c) {
    return String.format("#%06x", c.getRGB()&0xffffff);
    return String.format("#%06x", c.getRGB() & 0xFF_FF_FF);
  }
}
}}

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

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