TITLE:JComboBoxの文字色を変更する

Posted by aterai at 2011-02-14

JComboBoxの文字色を変更する

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

  • &jnlp;
  • &jar;
  • &zip;
ComboBoxForegroundColor.png

サンプルコード

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) {
    if(value!=null && value instanceof ColorItem) {
      ColorItem item = (ColorItem) value;
      Color ic = item.color;
      if(index<0 && ic!=null && !ic.equals(combo.getForeground())) {
        combo.setForeground(ic); //Windows XP
        list.setSelectionForeground(ic);
        list.setSelectionBackground(selectionBackground);
      }
      JLabel l = (JLabel)super.getListCellRendererComponent(
          list, item.description, index, isSelected, hasFocus);
      l.setForeground(item.color);
      l.setBackground(isSelected?selectionBackground:list.getBackground());
      return l;
    }else{
      super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);
      return this;
    }
  }
}

解説

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

  • Default:
    • セルレンダラはデフォルト
  • setForeground:
    • ListCellRendererでJListの選択時文字色(JList#setSelectionForeground)、選択時背景色(JList#setSelectionBackground)を変更
    • XPStyle.getXP()!=null の場合、フィールド部分の非選択時文字色は、JComboBoxの文字色(getForeground())が使用されるため、セルレンダラで、JComboBox#setForeground(Color) を使用
  • html tag:
    • 選択時背景色は、「setForeground:」と同様に、JList#setSelectionBackgroundを使用
    • セルレンダラで文字色をHtmlタグで変更
      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);
        }
      }
      

参考リンク

コメント