JComboBoxのドロップダウンリストにヘッダ・フッタを追加する
Total: 1589
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JComboBox
のドロップダウンリストにJLabel
のヘッダとJMenuItem
のフッタを追加します。
Screenshot
Advertisement
サンプルコード
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");
});
}
}
View in GitHub: Java, Kotlin解説
BasicComboPopup
のデフォルトレイアウトマネージャーは垂直BoxLayout
BasicComboPopup#configurePopup()
をオーバーライドしてドロップダウンリストとして使用されるJScrollPane
のほかにコンポーネントを追加可能
- ヘッダとして
JLabel
をContainer#add(label, 0)
でBasicComboPopup
の先頭に追加JLabel
をBoxLayout
に左揃えで追加する場合JComponent#setMaximumSize(...)
での最大サイズ、JComponent#setAlignmentX(...)
でx
軸揃えの設定が必要- 参考: BoxLayoutでリスト状に並べる
- フッタとして
JMenuItem
をBasicComboPopup
の末尾に追加JButton
を使用する場合マウスクリックでイベントが実行できないJMenuItem
を使用すればマウスクリック後にイベントが実行され、Accelerator
などの設定も可能