JMenuBarのレイアウトを変更して垂直方向にJMenuを配置する
Total: 95
, Today: 2
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JMenuBar
のレイアウトを垂直BoxLayout
に変更してJMenu
を垂直方向に並べて配置するサイドバーを作成します。
Screenshot
![Swing/VerticalMenuBar screenshot](https://ateraimemo.com/swing/verticalmenubar/screenshot.png)
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
以外は表示位置の修正は不要
- このサンプルでは