• title: JComboBoxの文字色を変更する tags: [JComboBox, ListCellRenderer, Html] author: aterai pubdate: 2011-02-14T15:46:36+09:00 description: JComboBoxの文字色を変更します。

概要

JComboBoxの文字色を変更します。

サンプルコード

class ComboForegroundRenderer extends DefaultListCellRenderer {
  private final Color selectionBackground = new Color(240,245,250);
  private final JComboBox combo;
  public ComboForegroundRenderer(JComboBox combo) {
    this.combo = combo;
  }
  @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())) {
        combo.setForeground(ic); //Windows, Motif Look&Feel
        list.setSelectionForeground(ic);
        list.setSelectionBackground(selectionBackground);
      }
      JLabel l = (JLabel)super.getListCellRendererComponent(
          list, item.description, index, isSelected, hasFocus);
      l.setForeground(ic);
      l.setBackground(isSelected?selectionBackground:list.getBackground());
      return l;
    }else{
      super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);
      return this;
    }
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、編集不可になっているJComboBoxの文字色を、選択中のアイテムから取得した色に変更するようなセルレンダラを設定しています。

  • Default
    • セルレンダラはデフォルト
  • setForeground
    • ListCellRendererJListの選択時文字色(JList#setSelectionForeground)、選択時背景色(JList#setSelectionBackground)を変更
    • XPStyle.getXP()!=nullWindows LookAndFeelや、Motif LookAndFeelの場合、フィールド部分の非選択時文字色は、JComboBoxの文字色(getForeground())が使用されるため、セルレンダラで、JComboBox#setForeground(Color)を使用
  • Html tag
    • 選択時背景色は、上記のsetForegroundと同様に、JList#setSelectionBackgroundを使用
    • セルレンダラで文字色をHtmlタグで変更
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) {
    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); //Integer.toHexString(c.getRGB() & 0xffffff)
  }
}

参考リンク

コメント