Подтвердить что ты не робот

Как создать JButton с меню?

Я хочу создать панель инструментов в своем приложении. Если вы нажмете кнопку на этой панели инструментов, откроется меню, как на панели инструментов Eclipse. Я не знаю, как это сделать в Свинге. Может кто-то мне помочь, пожалуйста? Я пробовал Google, но ничего не нашел.

4b9b3361

Ответ 1

Это намного труднее в 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);
    }
}

Ответ 2

Я не понимаю, почему это сложнее, чем нужно, или почему вы должны использовать MouseListener. Решение Steve McLeod работает, но там, где отображается меню, зависит от того, где была нажата мышь. Почему бы просто не использовать ActionListener, как обычно используется для JButton. Кажется, это не тяжелее и менее тяжело.

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 для меня, и позиция согласована. Вы можете поместить его по-другому, изменив x и y в menu.show().

Ответ 3

Я думаю, что это так же, как в AWT.

Вы должны поместить ActionCommand на эту кнопку, и когда она будет выполнена, отобразите всплывающее меню в соответствии с координатами мыши.

Ответ 6

Вот простой и приятный класс

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) {}
        });
    }
}