• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JComboBoxのドロップダウンリスト幅を指定値以上に保つ
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2007-09-10
*JComboBoxのポップアップ幅を指定値以上に保つ [#i9a11225]
JComboBoxのドロップダウンリストが表示されたとき、本体の幅が狭くても一定の幅以下にはならないように設定します。
---
category: swing
folder: ComboPopupWidth
title: JComboBoxのドロップダウンリスト幅を指定値以上に保つ
tags: [JComboBox, PopupMenuListener]
author: aterai
pubdate: 2007-09-10T08:19:10+09:00
description: JComboBoxのドロップダウンリストが表示されたとき、本体の幅が狭くても一定の幅以下にはならないように設定します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTJ8wQD77I/AAAAAAAAAVM/Ade6cu49JUQ/s800/ComboPopupWidth.png
---
* 概要 [#summary]
`JComboBox`のドロップダウンリストが表示されたとき、本体の幅が狭くても一定の幅以下にはならないように設定します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTJ8wQD77I/AAAAAAAAAVM/Ade6cu49JUQ/s800/ComboPopupWidth.png)

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTJ8wQD77I/AAAAAAAAAVM/Ade6cu49JUQ/s800/ComboPopupWidth.png)
* サンプルコード [#sourcecode]
#code(link){{
class WidePopupMenuListener implements PopupMenuListener {
  private static final int POPUP_MIN_WIDTH = 300;
  private boolean adjusting;

**サンプルコード [#v4b8bfc8]
#code(link){{
class MinWidthPopupMenuListener implements PopupMenuListener{
  private static final int POPUP_MIN_WIDTH = 320;
  private boolean adjusting = false;
  @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    JComboBox combo = (JComboBox)e.getSource();
    Dimension size  = combo.getSize();
    if(size.width>=POPUP_MIN_WIDTH) return;
    if(!adjusting) {
    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) {}
  @Override public void popupMenuCanceled(PopupMenuEvent e) {}

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

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

**解説 [#cc7f021e]
上記のサンプルでは、下二つのJComboBoxにPopupMenuListenerを実装したリスナーを設定しています。このリスナーでは、ポッアプメニュー(ドロップダウンリスト)が開かれる前にJComboBox本体の幅を指定値と比較し、小さかった場合は以下のような通常とは異なる手順でポッアプメニューの表示を行っています。
* 解説 [#explanation]
上記のサンプルでは、下`2`つの`JComboBox`に`PopupMenuListener`を実装したリスナーを設定しています。このリスナーでは、ポップアップメニューが開かれる前に`JComboBox`本体の幅を指定値と比較し、小さかった場合は以下のような通常とは異なる手順で表示を行っています。

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

**参考リンク [#a112d945]
-[http://forums.sun.com/thread.jspa?threadID=570675 Swing - How to widen the drop-down list in a JComboBox]
--dlinderm さんの投稿(2007/06/08 23:24)を参考にして、PopupMenuListenerを使用しています。
-[http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough Make JComboBox popup wide enough - Santhosh Kumar's Weblog]
--こちらには、JComboBox#doLayout()と、JComboBox#getSize()をオーバーライドして、十分な幅のドロップダウンリストを表示するサンプルがあります。
* 参考リンク [#reference]
- [https://community.oracle.com/thread/1368300 Swing - How to widen the drop-down list in a JComboBox]
-- dlindermさんの投稿(2007/06/08 23:24)に、`PopupMenuListener`を使用するサンプルがある
- [http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough Make JComboBox popup wide enough - Santhosh Kumar's Weblog]
-- `JComboBox#doLayout()`と、`JComboBox#getSize()`をオーバーライドして、十分な幅のドロップダウンリストを表示するサンプルがある

**コメント [#p6e4cf7f]
- メモ: [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4743225 Bug ID: 4743225 Size of JComboBox list is wrong when list is populated via PopupMenuListener]  -- [[aterai]] &new{2011-06-05 (日) 02:34:16};
* コメント [#comment]
#comment
- メモ: [https://bugs.openjdk.org/browse/JDK-4743225 Bug ID: 4743225 Size of JComboBox list is wrong when list is populated via PopupMenuListener]  -- &user(aterai); &new{2011-06-05 (日) 02:34:16};

#comment