TITLE:JComboBoxを使ってポップアップメニューをスクロール

JComboBoxを使ってポップアップメニューをスクロール

編集者:Terai Atsuhiro
作成日:2005-10-17
更新日:2021-09-23 (木) 11:51:26

概要

JComboBoxを使ってスクロール可能なポップアップメニューを表示します。

#screenshot

サンプルコード

JComboBox combo = new JComboBox(strArray);
BasicComboPopup popup = new BasicComboPopup(combo) {
  public boolean isFocusable() {
    return true;
  }
  protected void installListListeners() {
    super.installListListeners();
    list.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        append((String)combo.getSelectedItem());
      }
    });
  }
};
  • &jnlp;
  • &jar;
  • &zip;

解説

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

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

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

JFrameから、ポップアップメニューがはみ出す(親WindowがHeavyWeightWindowになる)場合、カーソルキーなどで、アイテムが移動選択できないバグがあったので、SwingUtilities.getWindowAncestor(popup).toFront();を追加するなどの修正*1をしました。

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)

参考リンク

コメント

  • 大変参考になりました。その上、マウスクリックで文字列を選定できるようにしたいですが、どうすればいかがですか? -- java
    • どうもです。とりあえず*2、手抜きですが、BasicComboPopup#installListListenersメソッドをオーバーライドしてマウスリスナーを追加してみました。 -- terai
  • 助かりました!感動です!ご回答ありがとうございました。 -- java