• title: JComboBoxを使ってポップアップメニューをスクロール tags: [BasicComboPopup, JTextPane, JComboBox] author: aterai pubdate: 2005-10-17 description: JComboBoxを使ってスクロール可能なポップアップメニューを表示します。

概要

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

サンプルコード

JComboBox combo = new JComboBox(strArray);
BasicComboPopup popup = new BasicComboPopup(combo) {
  @Override public boolean isFocusable() {
    return true;
  }
  private MouseAdapter listener = null;
  @Override protected void installListListeners() {
    super.installListListeners();
    listener = new MouseAdapter() {
      @Override public void mouseClicked(MouseEvent e) {
        hide();
        System.out.println(comboBox.getSelectedItem());
        append((String)combo.getSelectedItem());
      }
    };
    if(listener!=null) {
      list.addMouseListener(listener);
    }
  }
  @Override public void uninstallingUI() {
    if(listener != null) {
      list.removeMouseListener(listener);
      listener = null;
    }
    super.uninstallingUI();
  }
};
View in GitHub: Java, Kotlin

解説

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

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

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


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

private void popupMenu(ActionEvent e) {
  Rectangle rect = getMyPopupRect();
  popup.show(jtp, rect.x, rect.y + rect.height);
  EventQueue.invokeLater(new Runnable() {
    @Override public void run() {
      SwingUtilities.getWindowAncestor(popup).toFront();
      popup.requestFocusInWindow();
    }
  });
}
BasicComboPopup1.png
  • ただし、バージョン(6uN?)、Web Startなどで実行すると、AccessControlExceptionが発生します。
Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.awt.AWTPermission setWindowAlwaysOnTop)

参考リンク

コメント