java - 如何在 Java Swing 工具栏中创建 "Drop-Down"菜单?

标签 java swing menu drop-down-menu jtoolbar

我在我的 Swing JToolBar 上创建了一个下拉菜单。但它并没有按照我想要的方式创造行为。我的目标是让它像 Firefox 的“智能书签”按钮一样工作。

当用户选择菜单项时它会消失:正确!

当用户按下 ESC 时它会消失:正确!

当用户点击菜单外主框架中的某处时,它会消失:正确!

但是当用户第二次点击显示下拉菜单的按钮时它并没有消失:不正确... :-(

我的问题是如何添加这种行为,当第二次点击显示菜单的按钮时它会消失。

这是我当前的代码,来自 Mac 上的 Java 6:

import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class ScratchSpace {

    public static void main(String[] arguments) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Toolbar with Popup Menu demo");

                final JToolBar toolBar = new JToolBar();
                toolBar.add(createMoreButton());

                final JPanel panel = new JPanel(new BorderLayout());
                panel.add(toolBar, BorderLayout.NORTH);
                panel.setPreferredSize(new Dimension(600, 400));
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private static AbstractButton createMoreButton() {
        final JToggleButton moreButton = new JToggleButton("More...");
        moreButton.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    createAndShowMenu((JComponent) e.getSource(), moreButton);
                }
            }
        });
        moreButton.setFocusable(false);
        moreButton.setHorizontalTextPosition(SwingConstants.LEADING);
        return moreButton;
    }

    private static void createAndShowMenu(final JComponent component, final AbstractButton moreButton) {
        JPopupMenu menu = new JPopupMenu();
        menu.add(new JMenuItem("Black"));
        menu.add(new JMenuItem("Red"));

        menu.addPopupMenuListener(new PopupMenuListener() {
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
            }

            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                moreButton.setSelected(false);
            }

            public void popupMenuCanceled(PopupMenuEvent e) {
                moreButton.setSelected(false);
            }
        });

        menu.show(component, 0, component.getHeight());
    }
}

最佳答案

好吧,这是一个并非没有缺点的潜在解决方案。只有您可以决定这是否适合您的应用程序。问题是弹出窗口关闭发生在其他鼠标处理事件被触发之前,因此再次单击您的 More.. 按钮会导致弹出窗口隐藏,从而在按钮甚至被告知它被按下之前将按钮状态重置为取消选择。

简单的解决方法是在主程序中添加以下调用:

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);

这样做的结果是,每当弹出菜单因鼠标按下事件而关闭时,该鼠标事件将在菜单关闭时被消耗,并且不会传递给鼠标下的任何其他组件.如果您可以忍受限制,这是一个简单的解决方案。

关于java - 如何在 Java Swing 工具栏中创建 "Drop-Down"菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900293/

相关文章:

java - 计算队列中的消息(以编程方式)-Jboss 7

java - 如何在java中从另一个类中删除jTable列

css - 仅使用 wp 导航菜单显示当前页面子菜单

android - Kotlin:如何使用 Anko DSL 制作工具栏菜单?

html - CSS:关于我的响应式标题设计的问题

java - Mqtt主题Java中订阅者处于非 Activity 状态时如何获取生产者发送的所有数据(不保留或最后一条消息)

java - Vaadin,应用自己的主题不起作用

java - Webdriver showModalDialog

java - 当仅更改所选列时,不会调用 valueChanged 方法

java - 仅当我按键盘上的菜单键时,JPopupMenu 才跳转几行