web-dev-qa-db-ja.com

メニュー付きのJButtonを作成する方法は?

アプリケーションにツールバーを作成したいのですが。そのツールバーのボタンをクリックすると、Eclipseのツールバーと同じようにメニューがポップアップします。 Swingでこれを行う方法がわかりません。誰かが私を助けてくれますか? Googleを試しましたが何も見つかりませんでした。

32
Kien Truong

これはSwingで必要以上に困難です。そこで、チュートリアルを紹介する代わりに、完全に機能する例を作成しました。

import javax.swing.*;
import Java.awt.*;
import Java.awt.event.ActionEvent;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;

public class ToolbarDemo {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 400));
        final JToolBar toolBar = new JToolBar();

        //Create the popup menu.
        final JPopupMenu popup = new JPopupMenu();
        popup.add(new JMenuItem(new AbstractAction("Option 1") {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Option 1 selected");
            }
        }));
        popup.add(new JMenuItem(new AbstractAction("Option 2") {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Option 2 selected");
            }
        }));

        final JButton button = new JButton("Options");
        button.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        });
        toolBar.add(button);

        frame.getContentPane().add(toolBar, BorderLayout.NORTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
31
Steve McLeod

なぜこれが必要以上に難しいのか、なぜMouseListenerを使用すべきなのかわかりません。 Steve McLeodによる解決策は機能しますが、メニューが表示される場所は、マウスがクリックされた場所によって異なります。 JButtonに通常使用されるActionListenerを使用しないのはなぜですか。難しくも少なくもないようです。

final JPopupMenu menu = new JPopupMenu();
menu.add(...whatever...);

final JButton button = new JButton();
button.setText("My Menu");
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ev) {
        menu.show(button, button.getBounds().x, button.getBounds().y
           + button.getBounds().height);
    }
});

これにより、メニューはJMenuBarのメニューとほぼ同じ位置に配置され、位置は一貫しています。 menu.show()でxとyを変更して、別の場所に配置することもできます。

14
Kenneth Evans

AWTと同じだと思います。

そのボタンにActionCommandを配置し、ボタンが実行されると、マウスの座標に従ってポップアップメニューを表示する必要があります。

2
Cristina

メニューの使用方法 のセクションポップアップメニューの表示を参照してください。

2
TH.

私はあなたを正しく理解しているとは思いませんが、Swingでツールバーを作成する方法を知りたい場合は、これをチェックしてください

Javaチュートリアル:ツールバーの使用方法 そしてこれ

Javaチュートリアル:アクションの使用方法

1
jitter

ここにシンプルでニースのクラスがあります

enter image description here

import javax.swing.JPopupMenu;
import javax.swing.JToggleButton;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import Java.awt.event.ActionListener;
import Java.awt.event.ActionEvent;

public class MenuButton extends JToggleButton {

    JPopupMenu popup;

    public MenuButton(String name, JPopupMenu menu) {
        super(name);
        this.popup = menu;
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
                JToggleButton b = MenuButton.this;
                if (b.isSelected()) {
                    popup.show(b, 0, b.getBounds().height);
                } else {
                    popup.setVisible(false);
                }
            }
        });
        popup.addPopupMenuListener(new PopupMenuListener() {
            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                MenuButton.this.setSelected(false);
            }
            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {}
        });
    }
}
0
luca