---
category: swing
folder: ComboItemHeight
title: JComboBoxの高さを変更する
tags: [JComboBox, ListCellRenderer]
author: aterai
pubdate: 2009-03-02T12:37:58+09:00
description: JComboBox自体の高さや、ドロップダウンリスト内にあるアイテムの高さを変更します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTJ6VVptrI/AAAAAAAAAVI/x72zWGymqHk/s800/ComboItemHeight.png
---
* 概要 [#summary]
`JComboBox`自体の高さや、ドロップダウンリスト内にあるアイテムの高さを変更します。

#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTJ6VVptrI/AAAAAAAAAVI/x72zWGymqHk/s800/ComboItemHeight.png)

* サンプルコード [#sourcecode]
#code(link){{
JComboBox<String> combo2 = new JComboBox<>(items);
combo2.setRenderer(new DefaultListCellRenderer() {
  private int cheight;
  @Override public Component getListCellRendererComponent(
      JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    Dimension d = super.getPreferredSize();
    cheight = index < 0 ? d.height : 32;
    return this;
  }

  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.height = cheight;
    return d;
  }
});
}}

* 解説 [#explanation]
- `setPreferredSize`
-- セルレンダラーに`setPreferredSize(...)`メソッドで高さを設定
#code{{
JComboBox combo1 = new JComboBox(items);
JLabel renderer1 = (JLabel) combo1.getRenderer();
renderer1.setPreferredSize(new Dimension(0, 32));
}}

- `getListCellRendererComponent`
-- セルレンダラーの`getListCellRendererComponent(...)`メソッド内で、`index`が`0`以上の場合は`getPreferredSize()`メソッドで取得する高さを切り替える

- `html`
-- `html`タグを使用してセルレンダラーに高さを指定
#code{{
JComboBox<String> combo3 = new JComboBox<>(items);
combo3.setRenderer(new DefaultListCellRenderer() {
  @Override public Component getListCellRendererComponent(
      JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus) {
        JList list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
    String title = Objects.toString(value, "");
    if (index >= 0) {
      title = String.format("<html><table><td height='32'>%s", value);
    }
    return super.getListCellRendererComponent(list, title, index, isSelected, cellHasFocus);
  }
});
}}

- `icon`
-- 幅ゼロのアイコンを使用してセルレンダラーに高さを指定
#code{{
JComboBox<String> combo4 = new JComboBox<>(items);
combo4.setRenderer(new DefaultListCellRenderer() {
  @Override public Component getListCellRendererComponent(
      JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    if (index >= 0) {
      setIcon(new Icon() {
        @Override public void paintIcon(Component c, Graphics g, int x, int y) {}
        @Override public int getIconWidth()  { return 0;  }
        @Override public int getIconHeight() { return 32; }
      });
    } else {
      setIcon(null);
    }
    //setIconTextGap(0);
    return this;
  }
});
}}

----
- `DefaultListCellRenderer`を編集可能にした`JComboBox`に設定すると、リストアイテム文字列が空`""`の場合、ドロップダウンリスト内でのそのアイテムの高さが余白分のみ(`2px`)になってしまう
-- 参考: [https://stackoverflow.com/questions/30755058/defaultlistcellrenderer-does-not-render-empty-string-correctly-when-using-an-edi java - DefaultListCellRenderer does not render empty String correctly when using an editable combo box - Stack Overflow]
-- 上記のサンプルも`DefaultListCellRenderer`を使用しているが、直接高さを指定しているので編集可にしてもこの状態にはならない
-- `JComboBox#setPrototypeDisplayValue(...)`で文字列を設定していても、高さには効果がない
-- 回答にある`BasicComboBoxRenderer`でこの状態にならない理由は、以下のように`BasicComboBoxRenderer#getPreferredSize()`をオーバーライドし、空白文字を一時的に追加してから高さを求めているため
#code{{
@Override public Dimension getPreferredSize() {
  Dimension size;
  if ((this.getText() == null) || (this.getText().equals(""))) {
    setText(" ");
    size = super.getPreferredSize();
    setText("");
  } else {
    size = super.getPreferredSize();
  }
  return size;
}
}}

* 参考リンク [#reference]
- [https://stackoverflow.com/questions/30755058/defaultlistcellrenderer-does-not-render-empty-string-correctly-when-using-an-edi java - DefaultListCellRenderer does not render empty String correctly when using an editable combo box - Stack Overflow]

* コメント [#comment]
#comment
- `html`タグを使用するサンプルなどを追加。 -- &user(aterai); &new{2013-12-20 (金) 20:06:03};
- 幅ゼロのアイコンを使用するサンプルなどを追加。 -- &user(aterai); &new{2015-06-11 (金) 11:23:55};

#comment