Swing/MultiPartPopupMenu のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MultiPartPopupMenu へ行く。
- 1 (2026-03-09 (月) 07:48:02)
- category: swing folder: MultiPartPopupMenu title: JPopupMenuとJToolBarを同時にポップアップ表示する title-en: Popup a JPopupMenu and a JToolBar at the same time tags: [JPopupMenu, JToolBar] author: aterai pubdate: 2026-03-09T07:38:12+09:00 description: JPopupMenuの背景を透明に変更し、JToolBarとメニューボタンを分離して配置することで両方を同時に表示します。 summary-jp: JPopupMenuの背景を透明に変更し、JToolBarとメニューボタンを分離して配置することで両方を同時に表示します。 summary-en: Change the JPopupMenu background to transparent and separate the JToolBar and menu button to display both at the same time. image: https://drive.google.com/uc?id=1quXipIeJMXt9GvE8PKW4LDF1Hju2wES9
Summary
JPopupMenuの背景を透明に変更し、JToolBarとメニューボタンを分離して配置することで両方を同時に表示します。
Screenshot

Advertisement
Source Code Examples
private static JPopupMenu createCustomPopup() {
JPopupMenu popup = new JPopupMenu() {
@Override public void updateUI() {
setUI(new TransparentPopupMenuUI());
setOpaque(false);
}
};
popup.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
popup.setLayout(new BorderLayout(0, 8));
JToolBar toolbar = new RoundedToolBar(15);
toolbar.setFloatable(false);
toolbar.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5));
Arrays.asList("📋", "💾", "🔍", "🔖", "🔋", "🔔")
.forEach(icon -> toolbar.add(createIconButton(icon)));
RoundPanel menuPanel = new RoundPanel(15);
menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));
menuPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
Arrays.asList("Properties", "Rename", "Save", "Delete")
.forEach(text -> menuPanel.add(createMenuButton(text, popup)));
popup.add(toolbar, BorderLayout.NORTH);
popup.add(menuPanel, BorderLayout.WEST);
return popup;
}
View in GitHub: Java, KotlinDescription
- 親
JPopupMenu- 背景ウィンドウを完全に透明化
- 間隔を開けて子
JToolBarと子JPanel(JButtonを配置)を配置することで個別にポップアップしたように見せかけている
- 子
JToolBar- 横長ツールバー
JToolBar#setFloatable(false)で浮動を不可に設定
- 子
JPanelJPanelにJMenuItemを配置するとマウスオーバーで親JPopupMenuが閉じる場合があるのでJButtonで代用BorderLayout.WESTで左側に寄せて配置