【问题标题】:How to create a JButton with a menu?如何创建带有菜单的 JButton?
【发布时间】:2010-12-14 03:24:21
【问题描述】:

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

【问题讨论】:

    标签: java swing menu jbutton jpopupmenu


    【解决方案1】:

    这是一个简单而漂亮的类

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 方法的问题是弹出菜单仅在用户释放鼠标按钮时出现。菜单应该在鼠标按下时出现,而不是鼠标向上
      • 你是对的。我没有注意到。我仍然比其他方式更喜欢它,但两者都不完全令人满意。我最终没有以这种方式实现我试图做的事情,所以无论如何都没有使用它。我想你可以做你所做的,并使用我的 menu.show 版本和按钮坐标来避免位置不一致。
      • 这是一个更好的答案,应该得到更多的选票。看起来比鼠标点击位置更好。
      • 这是错误的。这些位置与您在 menu.show 中传递的组件相关,要获得所需的效果,您需要menu.show(button, 0, button.getHeight())
      【解决方案3】:

      这在 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);
          }
      }
      

      【讨论】:

      • 我一直在做这样的事情,但没有 JToolBar。您的解决方案是否有这样的行为:如果您再次单击该按钮并打开菜单,它会再次弹出菜单,而不是关闭它?
      • 我也做了一些稍微不同的事情:popup.show(c, 0, c.getHeight());
      • 谢谢。这是我找到的最容易理解的解决方案,所以我会使用它,尽管它不完全是 Dropdown JButton。其他解决方案太复杂了,我无法理解。我在下面列出了其中一些。 netbeans.dzone.com/news/drop-down-buttons-swing-new-alpushing-pixels.org/?p=199
      • 据我所知,没有下拉JButton。您必须自己制作,也许通过向 JButton 添加适当的图标。
      • 如果您想制作它以使其具有您在 Microsoft 中看到的箭头(向下)图像,该怎么办。
      【解决方案4】:

      请参阅How to Use Menus 中的弹出弹出菜单部分。

      【讨论】:

      【解决方案5】:

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

      Java Tutorials: How to Use Tool Bars 和这个

      Java Tutorials: How to Use Actions

      【讨论】:

        【解决方案6】:

        我认为这与 AWT 中的相同。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 2013-09-03
          • 2011-12-01
          • 2015-04-19
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多