Swing/ToolButtonPopup のバックアップの現在との差分(No.30)
- category: swing
folder: ToolButtonPopup
title: JToggleButtonからポップアップメニューを開く
tags: [JToggleButton, JPopupMenu, JToolBar, Icon]
author: aterai
pubdate: 2006-07-10T10:10:27+09:00
description: クリックするとポップアップメニューを表示するJToggleButtonを作成し、これをツールバーに追加します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2008/12/adding-jpopupmenu-to-jtoolbar-button.html lang: en
概要
クリックするとポップアップメニューを表示するJToggleButton
を作成し、これをツールバーに追加します。
Screenshot
Advertisement
サンプルコード
class MenuArrowIcon implements Icon {
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(Color.BLACK);
g2.translate(x, y);
g2.drawLine(2, 3, 6, 3);
g2.drawLine(3, 4, 5, 4);
g2.drawLine(4, 5, 4, 5);
g2.dispose();
}
#spanadd
#spanend
@Override public int getIconWidth() {
return 9;
}
#spanadd
#spanend
@Override public int getIconHeight() {
return 9;
}
}
#spanadd
#spanend
class MenuToggleButton extends JToggleButton {
private static final Icon i = new MenuArrowIcon();
public MenuToggleButton() {
private static final Icon ARROW_ICON = new MenuArrowIcon();
private JPopupMenu popup;
#spanadd
#spanend
protected MenuToggleButton() {
this("", null);
}
public MenuToggleButton(Icon icon) {
#spanadd
#spanend
protected MenuToggleButton(Icon icon) {
this("", icon);
}
public MenuToggleButton(String text) {
#spanadd
#spanend
protected MenuToggleButton(String text) {
this(text, null);
}
public MenuToggleButton(String text, Icon icon) {
#spanadd
#spanend
protected MenuToggleButton(String text, Icon icon) {
super();
Action a = new AbstractAction(text) {
@Override public void actionPerformed(ActionEvent ae) {
MenuToggleButton b = (MenuToggleButton) ae.getSource();
if (pop != null) {
pop.show(b, 0, b.getHeight());
}
Action action = new AbstractAction(text) {
@Override public void actionPerformed(ActionEvent e) {
Component b = (Component) e.getSource();
Optional.ofNullable(getPopupMenu()).ifPresent(p -> p.show(b, 0, b.getHeight()));
}
};
a.putValue(Action.SMALL_ICON, icon);
setAction(a);
action.putValue(Action.SMALL_ICON, icon);
setAction(action);
setFocusable(false);
setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4 + i.getIconWidth()));
setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4 + ARROW_ICON.getIconWidth()));
}
protected JPopupMenu pop;
@Override public void setPopupMenu(final JPopupMenu pop) {
this.pop = pop;
#spanadd
#spanend
public JPopupMenu getPopupMenu() {
return popup;
}
#spanadd
#spanend
public void setPopupMenu(JPopupMenu pop) {
this.popup = pop;
pop.addPopupMenuListener(new PopupMenuListener() {
@Override public void popupMenuCanceled(PopupMenuEvent e) {}
@Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
@Override public void popupMenuCanceled(PopupMenuEvent e) {
/* not needed */
}
#spanadd
#spanend
@Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
/* not needed */
}
#spanadd
#spanend
@Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
setSelected(false);
}
});
}
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension dim = getSize();
Insets ins = getInsets();
int x = dim.width - ins.right;
int y = ins.top + (dim.height - ins.top - ins.bottom - i.getIconHeight()) / 2;
i.paintIcon(this, g, x, y);
int y = ins.top + (dim.height - ins.top - ins.bottom - ARROW_ICON.getIconHeight()) / 2;
ARROW_ICON.paintIcon(this, g, x, y);
}
}
View in GitHub: Java, Kotlin解説
-
JToggleButton
の右側に余白を設定して、そこに下向きの矢印アイコンを描画 -
JToggleButton
にActionListener
を追加し、クリックするとJPopupMenu#show(...)
メソッドでJPopupMenu
を表示-
JPopupMenu
の表示位置は、クリック位置ではなくJToggleButton
の下辺になるよう調整
-
-
JToggleButton
の右側に余白を設定してそこに下向きの矢印アイコンを描画 -
JToggleButton
にActionListener
を追加しクリックするとJPopupMenu#show(...)
メソッドでJPopupMenu
を表示-
JPopupMenu
の表示位置はクリック位置ではなくJToggleButton
の下辺になるよう調整
-