36

我想在我的应用程序中创建一个工具栏。如果单击该工具栏上的按钮,它将弹出一个菜单,就像在 Eclipse 的工具栏中一样。我不知道如何在 Swing 中做到这一点。有人能帮助我吗?我试过谷歌但一无所获。

4

7 回答 7

33

这在 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);
    }
}
于 2009-11-07T15:02:10.620 回答
17

我不明白为什么这比它需要的更难,或者为什么你应该使用 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 来以不同的方式放置它。

于 2012-10-16T18:16:30.937 回答
2

我认为这与 AWT 中的相同。

您应该在该按钮上放置一个 ActionCommand,并在执行时根据鼠标坐标显示弹出菜单。

于 2009-11-07T10:50:07.117 回答
2

请参阅如何使用菜单的弹出菜单部分。

于 2009-11-07T11:35:56.487 回答
2

这是一个简单而漂亮的课程

在此处输入图像描述

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) {}
        });
    }
}
于 2015-04-28T08:19:26.000 回答
1

我不确定我是否正确理解你,但如果你想知道如何在 Swing 中制作工具栏,请检查这个

Java 教程:如何使用工具栏和这个

Java 教程:如何使用操作

于 2009-11-07T11:30:34.763 回答
0

上面,亚当古德问,

您的解决方案是否具有以下行为:如果您再次单击该按钮并打开菜单,它会再次弹出菜单,而不是关闭它?

结果证明这是一项测试任务。我终于用一个 invokeLater 解决了这个问题,以在这种特殊情况下重新消失弹出窗口。我的解决方案还允许客户定制按钮和弹出菜单。

    /**
 * A button that will popup a menu.
 * The button itself is a JLabel and can be adjusted with all
 * label attributes. The popup menu is returned by getPopup;
 * menu items must be added to it.
 * <p>
 * Clicks outside the menu will dismiss it.
*/
public class MenuButton extends JLabel 
        implements MouseListener, PopupMenuListener {
    JPopupMenu popMenu;

    @SuppressWarnings("")
    public MenuButton() {
        super();
        popMenu = new JPopupMenu();
        addMouseListener(this);
        popMenu.addPopupMenuListener(this);
    }

    public JPopupMenu getPopup() { return popMenu; }
    
    @Override
    public void mousePressed(MouseEvent e) {
        if ( ! popMenu.isShowing()) {
            popMenu.show(this, 0, getBounds().height);
        }
    }
    @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
        SwingUtilities.invokeLater(()->{
            if (popMenu.isShowing()) {
                //  if shpwing, it was hidden and reshown
                //  by a mouse down in the 'this' button
                popMenu.setVisible(false);
            }
        });
    }

    @Override public void mouseClicked(MouseEvent e) { }
    @Override public void mouseReleased(MouseEvent e) { }
    @Override public void mouseEntered(MouseEvent e) { }
    @Override public void mouseExited(MouseEvent e) { }
    @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { }
    @Override public void popupMenuCanceled(PopupMenuEvent e) { }

} // end MenuButton

示例调用

    MenuButton button = new MenuButton();
    JPopupMenu menu = button.getPopup();
    menu.add("Browse Sample");
    menu.add("Save As ...");
    Icon hamburger = IOUtils.loadIconResource(
            IndexGofer.class, "images/hamburgerMenu.png");
            (IOUtils is on page http://physpics.com/Java/tools/
                  You should use your own tool to load an icon.)
    button.setIcon(hamburger);
    button.setOpaque(false);
于 2022-03-05T01:51:20.850 回答