【问题标题】:How do I make a JPopupMenu appear when any one of 3 JButtons is clicked, right-clicked, or dragged upon?当单击、右键单击或拖动 3 个 JButton 中的任何一个时,如何使 JPopupMenu 出现?
【发布时间】:2012-06-02 07:35:44
【问题描述】:

我正在尝试为文件浏览器制作一组导航按钮。我想要这样,如果用户单击专用的历史按钮,就会出现一个 JPopupMenu。但是,我还希望在用户右键单击或将光标向下拖动到后退或前进按钮时出现完全相同的菜单。 如何为不同手势的多个 GUI 组件显示完全相同的 JPopupMenu(不是副本,而是完全相同)?

到目前为止,我已经尝试了以下方法:

histButton.addMouseListener(new MouseAdapter()
{
  @Override public void mouseClicked(MouseEvent e)
  {
    showPopup(e);
  }

  @Override public void mouseDragged(MouseEvent e)
  {
    showPopup(e);
  }

  private void showPopup(MouseEvent e)
  {
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
  }
});
forwardButton.addMouseListener(new MouseAdapter()
{
  @Override public void mouseClicked(MouseEvent e)
  {
    if (e.isPopupTrigger())
      showPopup(e);
  }

  @Override public void mouseDragged(MouseEvent e)
  {
    showPopup(e);
  }

  private void showPopup(MouseEvent e)
  {
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
  }
});
backButton.addMouseListener(new MouseAdapter()
{
  @Override public void mouseClicked(MouseEvent e)
  {
    if (e.isPopupTrigger())
      showPopup(e);
  }

  @Override public void mouseDragged(MouseEvent e)
  {
    showPopup(e);
  }

  private void showPopup(MouseEvent e)
  {
    histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
  }
});

所有组件均已添加并正确显示,调试显示它们注册了事件,但没有出现菜单。

【问题讨论】:

  • 很好,但为了尽快获得更好的帮助,请发帖 SSCCE
  • 信息不足。 histPopupMenu 里面有什么?再次,SSCCE 请!
  • @Supuhstar 1) 你的概念可能会让用户感到沮丧 2) 有可能,但不是这样(重写 LeftMouseButton 需要一堆代码) 3) 发布 SSCCE 4) JFileBrowres 是复合 JComponent,你可以使用已实现的 JButton 提取 JPanel 和/或添加/替换为自己的 5)可能 JPopup 不是弹出窗口的正确容器

标签: java swing mouseevent popupmenu jpopupmenu


【解决方案1】:

Bringing Up a Popup Menu 显示了使用mousePressed()mouseReleased()isPopupTrigger() 的传统实现。请注意,“应显示弹出菜单的确切手势因外观而异。”您可以将显示的内容与使用 mousePressed() 的实现进行比较。

附录:作为参考,@mKorbel 回忆了这个可能有用的client property

import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;

/** @author mKorbel */
public class ComboBoxAction extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JComboBox comboBox;
    private JFrame frame;

    public ComboBoxAction() {
        comboBox = new JComboBox();
        comboBox.addActionListener(this);
        comboBox.addItem("Item 1");
        comboBox.addItem("Item 2");
        comboBox.addItem("Item 3");
        comboBox.addItem("Item 4");
        for (Component component : comboBox.getComponents()) {
            if (component instanceof AbstractButton) {
                if (component.isVisible()) {
                    comboBox.remove(component);
                }
            }
        }
        //This prevents action events from being fired when the
        //up/down arrow keys are used on the dropdown menu
        comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        comboBox.firePopupMenuWillBecomeVisible();
        frame = new JFrame();
        frame.add(comboBox);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(comboBox.getSelectedItem());
        //make sure popup is closed when 'isTableCellEditor' is used
        comboBox.hidePopup();
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ComboBoxAction();
            }
        });
    }
}

【讨论】:

  • +1 为什么不把带有从 BasicComboBoxUI 中移除的 Button 的 JComboBox 放在那里,基本上也可以将派生 Popup 的 setLocation 设置到 BasicComboBoxUI 中,只是想法
  • @mKorbel:很有趣。我是否正确推断这与您的评论 here 和您的 +1 建议 here 相似?
  • 基本上你是对的,我会在我的 PC 中搜索 (un_complete) 代码
  • 请为我对您帖子的编辑道歉,请在阅读后恢复(其余可能是重新布局 JComboBox,并使用当前 JButtons Gradient 中的颜色数组着色 :-))
  • 这似乎是用于组合框中的弹出窗口。我想要一个用于 JPopupMenu。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多