Swing/PopupMenuLayout のバックアップの現在との差分(No.1)
-
category: swing
folder: PopupMenuLayout
title: JPopupMenuのレイアウトを変更して上部にメニューボタンを追加する
tags: [JPopupMenu, GridBagLayout, JMenuItem, Icon]
tags: [JPopupMenu, GridBagLayout, JMenuItem, Icon, LayoutManager]
author: aterai
pubdate: 2014-09-29T00:00:12+09:00
description: JPopupMenuのレイアウトを変更することで、上部にメニューボタンを水平に並べて表示します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2014/09/change-layout-of-jpopupmenu-to-use.html lang: en
概要
概要
JPopupMenu
のレイアウトを変更することで、上部にメニューボタンを水平に並べて表示します。
Screenshot
Advertisement
サンプルコード
サンプルコード
JPopupMenu popup = new JPopupMenu();
GridBagConstraints c = new GridBagConstraints();
popup.setLayout(new GridBagLayout());
#spandel
c.gridheight = 1;
#spanend
#spandel
c.weightx = 1.0;
#spanend
#spandel
c.weighty = 0.0;
#spanend
#spanadd
c.weightx = 1d;
#spanend
#spanadd
c.weighty = 0d;
#spanend
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.CENTER;
#spandel
c.gridwidth = 1;
#spanend
c.gridy = 0;
#spandel
c.gridx = 0; popup.add(makeButton("\u21E6"), c);
#spanend
#spandel
c.gridx = 1; popup.add(makeButton("\u21E8"), c);
#spanend
#spandel
c.gridx = 2; popup.add(makeButton("\u21BB"), c);
#spanend
#spandel
c.gridx = 3; popup.add(makeButton("\u2729"), c);
#spanend
#spanadd
popup.add(makeButton("\u21E6"), c);
#spanend
#spanadd
popup.add(makeButton("\u21E8"), c);
#spanend
#spanadd
popup.add(makeButton("\u21BB"), c);
#spanend
#spanadd
popup.add(makeButton("\u2729"), c);
#spanend
#spanadd
c.insets = new Insets(2, 0, 2, 0);
#spanend
c.gridwidth = 4;
c.gridx = 0;
#spandel
c.insets = new Insets(2, 0, 2, 0);
#spanend
#spandel
c.gridy = 1; popup.add(new JSeparator(), c);
#spanend
#spanadd
c.gridy = GridBagConstraints.RELATIVE;
#spanend
#spanadd
popup.add(new JSeparator(), c);
#spanend
#spanadd
#spanend
c.insets = new Insets(0, 0, 0, 0);
#spandel
c.gridy = 2; popup.add(new JMenuItem("aaaaaaaaaa"), c);
#spanend
#spandel
c.gridy = 3; popup.add(new JPopupMenu.Separator(), c);
#spanend
#spandel
c.gridy = 4; popup.add(new JMenuItem("bbbb"), c);
#spanend
#spandel
c.gridy = 5; popup.add(new JMenuItem("ccccccccccccccccccccc"), c);
#spanend
#spandel
c.gridy = 6; popup.add(new JMenuItem("dddddddddd"), c);
#spanend
#spanadd
popup.add(new JMenuItem("aaaaaaaaaa"), c);
#spanend
#spanadd
popup.add(new JPopupMenu.Separator(), c);
#spanend
#spanadd
popup.add(new JMenuItem("bbbb"), c);
#spanend
#spanadd
popup.add(new JMenuItem("ccccccccccccccccccccc"), c);
#spanend
#spanadd
popup.add(new JMenuItem("dddddddddd"), c);
#spanend
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JPopupMenu
のレイアウトをGridBagLayout
に変更して、上部に4
つのメニューボタンを水平に並べて表示(FireFox
風?)します。
解説
上記のサンプルでは、JPopupMenu
のレイアウトをGridBagLayout
に変更して、上部に4
つのメニューボタンを水平に並べて表示します。これらのメニューボタンは、JMenuItem
の以下のメソッドをオーバーライドすることでJButton
風に表示を変更しています。
これらのメニューボタンは、JMenuItem
の以下のメソッドをオーバーライドすることで、ボタン風に表示を変更しています。
JMenuItem#paintComponent(...)
をオーバーライドして32x32
のIcon
のみを直接描画-
JMenuItem#setIcon(...)
を使用すると、文字列の左側にIcon
が表示される - ボタン中央に
Icon
が描画されるように位置を計算する(GridBagLayout
でGridBagConstraints.HORIZONTAL
と水平方向に拡張しているため、getSize()
で現在のボタンサイズを取得して中央を求める)
-
-
JMenuItem#getPreferredSize()
をオーバーライドして、Icon
のサイズを推奨サイズとして返す-
JMenuItem#setIcon(...)
を使用していないので、直接Icon
のサイズを渡す必要がある -
JMenuItem#setIcon(...)
を使用すると文字列の左側にIcon
が表示される - ボタン中央に
Icon
が描画されるように位置を計算する-
GridBagLayout
でGridBagConstraints.HORIZONTAL
と水平方向に拡張しているためgetSize()
で現在のボタンサイズを取得して中央を求める
-
-
-
JMenuItem#getPreferredSize()
をオーバーライドしてIcon
のサイズを推奨サイズとして返す-
JMenuItem#setIcon(...)
を使用していないので直接Icon
のサイズを渡す必要がある
-
final Icon icon = new SymbolIcon(symbol);
JMenuItem b = new JMenuItem() {
private final Dimension d = new Dimension(icon.getIconWidth(), icon.getIconHeight());
#spanadd
#spanend
@Override public Dimension getPreferredSize() {
return d;
}
@Override public void paintComponent(Graphics g) {
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension cd = getSize();
Dimension pd = getPreferredSize();
int offx = (int) (.5 + .5 * (cd.width - pd.width));
int offy = (int) (.5 + .5 * (cd.height - pd.height));
icon.paintIcon(this, g, offx, offy);
}
};
b.setOpaque(true);
参考リンク
参考リンク
- JMenuItemの内部にJButtonを配置する
- こちらは、
JPopupMenu
のレイアウトを変更するのではなく、JMenuItem
のレイアウトを変更して、JMenuItem
の子としてボタンを追加している - こちらは
JPopupMenu
のレイアウトを変更するのではなく、JMenuItem
のレイアウトを変更してJMenuItem
の子としてボタンを追加している
- こちらは、
- JPopupMenuをボタンの長押しで表示