TITLE:JComboBoxを使ってポップアップメニューをスクロール
#navi(../)
*JComboBoxを使ってポップアップメニューをスクロール [#cc8b9df3]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-10-17~
更新日:&lastmod;

#contents

**概要 [#ya56951b]
JComboBoxを使ってスクロール可能なポップアップメニューを表示します。

#screenshot

**サンプルコード [#q28e6ef6]
#code{{
JComboBox combo = new JComboBox(strArray);
BasicComboPopup popup = new BasicComboPopup(combo) {
  public boolean isFocusable() {
    return true;
  }
};
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#z7e217c3]
上記のサンプルでは、Shift+Tabでポップアップメニューが表示され、上下キーで移動、EnterでJTextPaneのカーソルの後に選択された文字列が入力されます。

コンボボックスのポップアップ部分のUIを表現するBasicComboPopupを利用することで、スクロールバーをもつポップアップメニューを実現しています。

フォースを取得して、キー入力で選択を変更できるように、%%BasicComboPopup#isFocusTraversable%% BasicComboPopup#isFocusableメソッドをオーバーライドしています。また、BasicComboPopup#showしたあと、BasicComboPopup#requestFocusInWindowする必要があります。

JFrameから、ポップアップメニューがはみ出す(親WindowがHeavyWeightWindowになる)場合、カーソルキーなどで、アイテムが移動選択できないバグがあったので、SwingUtilities.getWindowAncestor(popup).toFront();を追加するなどの修正をしました。
#code{{
private void popupMenu(ActionEvent e) {
  Rectangle rect = getMyPopupRect();
  popup.show(jtp, rect.x, rect.y + rect.height);
  EventQueue.invokeLater(new Runnable() {
    public void run() {
      SwingUtilities.getWindowAncestor(popup).toFront();
      popup.requestFocusInWindow();
    }
  });
}
}}
#screenshot(,screenshot2.png)

**参考リンク [#ieff35f1]
-[[Scrollable PopupMenu>http://forum.java.sun.com/thread.jspa?threadID=483165]]

**コメント [#c9eef0fd]
#comment