Swing/VerticalMenuBar のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/VerticalMenuBar へ行く。
- 1 (2024-07-15 (月) 05:51:37)
- category: swing folder: VerticalMenuBar title: JMenuBarのレイアウトを変更して垂直方向にJMenuを配置する tags: [JMenuBar, LayoutManager, JMenu, JPopupMenu] author: aterai pubdate: 2024-07-15T05:50:16+09:00 description: JMenuBarのレイアウトを垂直BoxLayoutに変更してJMenuを垂直方向に並べて配置するサイドバーを作成します。 image: https://drive.google.com/uc?id=1VnITMJfQEzvdh732gTpWAwrSRpBGKkYF
概要
JMenuBarのレイアウトを垂直BoxLayoutに変更してJMenuを垂直方向に並べて配置するサイドバーを作成します。
Screenshot
Advertisement
サンプルコード
JMenuBar menuBar = new JMenuBar() {
@Override public void updateUI() {
super.updateUI();
setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
// setLayout(new GridLayout(0, 1, 2, 2));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}
};
initMenuBar(menuBar);
MenuListener listener = new MenuListener() {
@Override public void menuSelected(MenuEvent e) {
Object src = e.getSource();
if (src instanceof JMenu && ((JMenu) src).isTopLevelMenu()) {
EventQueue.invokeLater(() -> {
JMenu menu = (JMenu) src;
Point loc = menu.getLocationOnScreen();
loc.x += menu.getWidth();
menu.getPopupMenu().setLocation(loc);
});
}
}
@Override public void menuDeselected(MenuEvent e) {
// Do nothing
}
@Override public void menuCanceled(MenuEvent e) {
// Do nothing
}
};
for (MenuElement m : menuBar.getSubElements()) {
if (m instanceof JMenu) {
JMenu menu = (JMenu) m;
menu.addMenuListener(listener);
Dimension d = menu.getMaximumSize();
d.width = Short.MAX_VALUE;
menu.setMaximumSize(d);
}
}
View in GitHub: Java, Kotlin解説
JMenuBar#setLayout(new BoxLayout(this, BoxLayout.Y_AXIS))
してJMenuBar
のレイアウトを水平BoxLayout
から垂直BoxLayout
に変更- BoxLayoutでリスト状に並べる
JSeparator
などを使用せず、縦JMenuBar
のすべての子Component
の高さが同じでよい場合は、JMenuBar#setLayout(new GridLayout(0, 1))
でJMenuBar
のレイアウトを行数指定なしで1
列のグリッドに変更する方法もある
JMenuBar
の子MenuElement
でトップレベルJMenu
をJMenuBar#getSubElements()
で取得し、そのJMenu
が開くJPopupMenu
の表示位置を修正するMenuListener
を追加- このサンプルでは
MenuListener#menuSelected(MenuEvent)
で親フレームの左側に配置された場合を想定してJMenuBar
の幅だけx
座標を右に移動 - JToolBar内にJMenuBarを配置して分離・移動可能に設定する
- トップレベル
JMenu
以外は表示位置の修正は不要
- このサンプルでは