概要

JComboBoxがそのセルサイズを決定するために使用するプロトタイプ値を設定します。

サンプルコード

combo3.setPrototypeDisplayValue(TITLE);
// ...
combo5.setRenderer(new SiteListCellRenderer<Site>());
combo5.setPrototypeDisplayValue(new Site(TITLE, new ColorIcon(Color.GRAY)));
View in GitHub: Java, Kotlin

解説

  1. デフォルト
    • モデルの中からサイズが最大となる要素を検索してJComboBoxの推奨サイズを決定する
    • 上記のサンプルではモデルが空なのでボタンの幅と余白がJComboBoxの推奨サイズになっている
  2. JComboBox#setPrototypeDisplayValue(...)で指定した要素からJComboBoxの推奨サイズを決定する
  3. 編集可能な場合のJComboBoxJComboBox#setPrototypeDisplayValue(...)を設定
  4. 独自の要素Eを使用するJComboBox<E>にその要素を表示するためのListCellRenderer<E>を設定
  5. 上記のJComboBox<E>JComboBox#setPrototypeDisplayValue(E)でプロトタイプ値を設定
  6. 上記のJComboBox<E>でモデルを空にしてListCellRendererで値がnullになる場合、JComboBox#setPrototypeDisplayValue(E)で設定した値が表示されてしまう
    class SiteListCellRenderer<E extends Site>
        extends JLabel
        implements ListCellRenderer<E> {
      @Override public Component getListCellRendererComponent(
          JList<? extends E> list, E value, int index,
          boolean isSelected, boolean cellHasFocus) {
        setOpaque(index >= 0);
        if (Objects.nonNull(value)) {
          setText(value.title);
          setIcon(value.favicon);
        } else {
          // JComboBox#setPrototypeDisplayValue(E)で設定した値が
          // 表示されないようにクリア
          setText("");
          setIcon(null);
        }
        // ...
    

参考リンク

コメント