概要

JComboBoxのドロップダウンリストが表示されたとき、本体の幅が狭くても一定の幅以下にはならないように設定します。

サンプルコード

class WidePopupMenuListener implements PopupMenuListener {
  private static final int POPUP_MIN_WIDTH = 300;
  private boolean adjusting;

  @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    JComboBox<?> combo = (JComboBox<?>) e.getSource();
    Dimension size = combo.getSize();
    if (size.width >= POPUP_MIN_WIDTH) {
      return;
    }
    if (!adjusting) {
      adjusting = true;
      combo.setSize(POPUP_MIN_WIDTH, size.height);
      combo.showPopup();
    }
    combo.setSize(size);
    adjusting = false;
  }

  @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    /* not needed */
  }

  @Override public void popupMenuCanceled(PopupMenuEvent e) {
    /* not needed */
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、下2つのJComboBoxPopupMenuListenerを実装したリスナーを設定しています。このリスナーでは、ポップアップメニューが開かれる前にJComboBox本体の幅を指定値と比較し、小さかった場合は以下のような通常とは異なる手順で表示を行っています。

  • JComboBoxのサイズを取得し保存
  • JComboBoxの幅を指定値まで拡大
  • JComboBox#showPopupでポップアップメニューを表示
    • ポップアップメニューの幅も、指定値まで拡大している
  • JComboBox本体のサイズを保存していた元の値に戻す

参考リンク

コメント