概要

JComboBoxに選択中のセルアイテム文字色を変更するセルレンダラーを設定します。

サンプルコード

class ComboForegroundRenderer extends DefaultListCellRenderer {
  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) {
      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(SELECTION_BACKGROUND);
      }
      JLabel l = (JLabel) super.getListCellRendererComponent(
          list, item.description, index, isSelected, hasFocus);
      l.setForeground(ic);
      l.setBackground(isSelected ? SELECTION_BACKGROUND
                                 : list.getBackground());
      return l;
    } else {
      super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);
      return this;
    }
  }
}
View in GitHub: Java, Kotlin

解説

  • 上: Default
    • デフォルトのリストセルレンダラーを使用
  • 中: setForeground
    • ListCellRendererJListの選択時文字色:JList#setSelectionForeground(...)、選択時背景色:JList#setSelectionBackground(...)を変更
    • XPStyle.getXP()!=nullWindowsLookAndFeelMotifLookAndFeelの場合フィールド部分の非選択時文字色はJComboBoxの文字色:getForeground()が使用されるため、セルレンダラーでJComboBox#setForeground(Color)を使用
  • 下: Html tag
    • 選択時背景色は上記のsetForegroundと同様にJList#setSelectionBackgroundを使用
    • セルレンダラーで文字色をHtmlタグで変更
class ComboHtmlRenderer extends DefaultListCellRenderer {
  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(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 ? SELECTION_BACKGROUND : list.getBackground());
    return l;
  }

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

参考リンク

コメント