Swing/HeaderFooterComboPopup の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/HeaderFooterComboPopup へ行く。
- Swing/HeaderFooterComboPopup の差分を削除
--- category: swing folder: HeaderFooterComboPopup title: JComboBoxのドロップダウンリストにヘッダ・フッタを追加する tags: [JComboBox, BasicComboPopup, JMenuItem] author: aterai pubdate: 2021-02-08T00:33:27+09:00 description: JComboBoxのドロップダウンリストにJLabelのヘッダとJMenuItemのフッタを追加します。 image: https://drive.google.com/uc?id=1EnxytV3-0UkzPYBy4iSqtRw6thFCOI5B hreflang: href: https://java-swing-tips.blogspot.com/2021/03/add-header-and-footer-in-jcombobox.html lang: en --- * 概要 [#summary] `JComboBox`のドロップダウンリストに`JLabel`のヘッダと`JMenuItem`のフッタを追加します。 #download(https://drive.google.com/uc?id=1EnxytV3-0UkzPYBy4iSqtRw6thFCOI5B) * サンプルコード [#sourcecode] #code(link){{ class HeaderFooterComboPopup extends BasicComboPopup { protected transient JLabel header; protected transient JMenuItem footer; public HeaderFooterComboPopup(JComboBox combo) { super(combo); } @Override protected void configurePopup() { super.configurePopup(); configureHeader(); configureFooter(); add(header, 0); add(footer); } protected void configureHeader() { header = new JLabel("History"); header.setBorder(BorderFactory.createEmptyBorder(4, 5, 4, 0)); header.setMaximumSize(new Dimension(Short.MAX_VALUE, 20)); header.setAlignmentX(1f); } protected void configureFooter() { int modifiers = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK; footer = new JMenuItem("Show All Bookmarks"); footer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, modifiers)); footer.addActionListener(e -> { Window w = SwingUtilities.getWindowAncestor(getInvoker()); JOptionPane.showMessageDialog(w, "Bookmarks"); }); } } }} * 解説 [#explanation] - `BasicComboPopup`のデフォルトレイアウトマネージャーは垂直`BoxLayout` -- `BasicComboPopup#configurePopup()`をオーバーライドしてドロップダウンリストとして使用される`JScrollPane`のほかにコンポーネントを追加可能 - ヘッダとして`JLabel`を`Container#add(label, 0)`で`BasicComboPopup`の先頭に追加 -- `JLabel`を`BoxLayout`に左揃えで追加する場合`JComponent#setMaximumSize(...)`での最大サイズ、`JComponent#setAlignmentX(...)`で`x`軸揃えの設定が必要 -- 参考: [[BoxLayoutでリスト状に並べる>Swing/ComponentList]] - フッタとして`JMenuItem`を`BasicComboPopup`の末尾に追加 -- `JButton`を使用する場合マウスクリックでイベントが実行できない -- `JMenuItem`を使用すればマウスクリック後にイベントが実行され、`Accelerator`などの設定も可能 * 参考リンク [#reference] - [[JPopupMenuのレイアウトを変更して上部にメニューボタンを追加する>Swing/PopupMenuLayout]] - [[BoxLayoutでリスト状に並べる>Swing/ComponentList]] * コメント [#comment] #comment #comment