【问题标题】:How do Display Custom PopupMenu in JComboBox如何在 JComboBox 中显示自定义弹出菜单
【发布时间】:2020-04-16 11:48:29
【问题描述】:

JComboBox 在点击时显示一个列表。我想显示JPopupMenu,而不是列表。 在下面的代码中,事件被触发,但弹出窗口没有出现。为什么?

JComboBox box = new JComboBox();

box.addPopupMenuListener(new PopupMenuListener() {
   @Override
   public void popupMenuWillBecomeVisible(PopupMenuEvent e) {      
     popupMenu.show(box, 0, box.getHeight());
   }
   ...
});

【问题讨论】:

  • 您可以将JPopupMenu 与任何JComponent 关联。为什么不做一个伪JComboBox?一个JTextField 和一个JButton,当你点击按钮时,会出现一个JPopupMenu
  • 为什么? - 是的,问题是你为什么要这样做? JComboBox 是为特定目的而设计的,用于显示添加到组合框中的项目列表。如果您想做一些不同的事情,那么您可以创建自己的自定义组件。在不知道您为什么要做这样的事情的情况下,我们无法提供替代建议,除了不要尝试将方形盒子放入圆孔中。
  • 我附近有一个 JComboBox,希望用户拥有完全相同的用户体验。所以 Button 必须看起来与 ComboBox 完全一样。我使用 Nimbus LAF,很难创建一个看起来像这样的按钮。这就是为什么我放弃了@Abra 和 camickr 建议的方法。
  • 你在comment 中写道:我正在使用 Nimbus LAF,很难创建一个看起来像这样的 Button。 也许这会有所帮助:Nimbus Defaults跨度>
  • 但是按钮和组合框应该看起来不同。他们不应该有相同的用户体验。祝你好运。

标签: java swing jcombobox jpopupmenu


【解决方案1】:

也可以使用鼠标监听器。由于 JDK 错误 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4144505 必须像这样将 mouseListener 添加到所有后代:

 MouseAdapter comboPopupAdapter = new MouseAdapter() {
      @Override
      public void mousePressed(MouseEvent e) {
        popupMenu.show(box, 0, box.getHeight());
      }
    };
    box.addMouseListener(comboPopupAdapter);
    for (Component c : box.getComponents()) {
      c.addMouseListener(comboPopupAdapter);
    }

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多