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

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


person Kien Truong    schedule 07.11.2009    source источник


Ответы (6)


В 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);
    }
}
person Steve McLeod    schedule 07.11.2009
comment
Я делал что-то подобное, но без JToolBar. Есть ли в вашем решении поведение, при котором, если вы снова нажмете кнопку с меню, оно снова откроет меню, а не закроет его? - person Adam Goode; 07.11.2009
comment
Я также сделал немного по-другому: popup.show(c, 0, c.getHeight()); - person Adam Goode; 07.11.2009
comment
Спасибо. Это самое простое для понимания решение, которое я нашел, поэтому я буду использовать его, хотя это не совсем раскрывающийся список JButton. Другие решения слишком сложны для меня, чтобы понять. Я перечислил некоторые из них ниже. ‹netbeans.dzone.com/news/drop-down-buttons -swing-new-al pushing-pixels.org/?p=199< /а> - person Kien Truong; 07.11.2009
comment
Насколько я знаю, выпадающего списка JButton нет. Вы должны создать свой собственный, возможно, добавив соответствующий значок в JButton. - person Steve McLeod; 08.11.2009
comment
Что, если вы хотите сделать это так, чтобы оно имело изображение со стрелкой (вниз), которое вы видите в Microsoft. - person Doug Hauf; 24.02.2014
comment
Не могли бы вы добавить скриншот, пожалуйста? - person Anders Lindén; 29.05.2016

Я не понимаю, почему это сложнее, чем должно быть, или почему вы должны использовать MouseListener. Решение Стива МакЛеода работает, но то, где появляется меню, зависит от того, где была нажата мышь. Почему бы просто не использовать 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().

person Kenneth Evans    schedule 16.10.2012
comment
Проблема с подходом заключается в том, что всплывающее меню появляется только тогда, когда пользователь отпускает кнопку мыши. Меню должно появляться при нажатии мыши, а не при поднятии мыши. - person Steve McLeod; 19.12.2012
comment
Ты прав. Я не заметил. Мне по-прежнему нравится это лучше, чем по-другому, но ни один из них не является полностью удовлетворительным. В итоге я не реализовал то, что пытался сделать таким образом, и поэтому все равно не использовал его. Я думаю, вы могли бы сделать то же, что и вы, и использовать мою версию menu.show с координатами кнопки, чтобы избежать несогласованности позиций. - person Kenneth Evans; 20.12.2012
comment
Это гораздо лучший ответ, и он должен получить больше голосов. Выглядит лучше, чем расположение щелчка мыши. - person Raj; 17.08.2013
comment
Это не правильно. Позиции относятся к компоненту, который вы передаете в menu.show, чтобы получить желаемый эффект, вам понадобится menu.show(button, 0, button.getHeight()). - person Nand; 18.08.2020

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

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

person Cristina    schedule 07.11.2009

См. раздел Вызов всплывающего меню в Как пользоваться меню.

person TH.    schedule 07.11.2009
comment
просто это более конкретная ссылка: docs.oracle.com /javase/tutorial/uiswing/components/ - person pratikabu; 07.06.2013

Я не уверен, что правильно вас понял, но если вы хотите узнать, как создавать панели инструментов в Swing, проверьте это

Учебники по Java: использование панелей инструментов и это

Учебники по Java: использование действий

person jitter    schedule 07.11.2009

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

введите здесь описание изображения

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) {}
        });
    }
}
person luca    schedule 28.04.2015