JComboBox mouseClicked on cell

JComboBox mouseClicked on cell

我试图在用户单击(使用鼠标)JComboBox 中的项目时调用一个函数;但是,我不希望为任何键盘事件触发此事件 - 我只希望在单击下拉列表的特定单元格时触发此事件(我知道 addActionListener 和 addItemListener,但这些事件比我想要的更多)。

编辑:我应该指定 mouseClicked 也不起作用 - 似乎没有事件被触发(但是,它们在某一时刻发生,但当发生这种情况时,它们也会因点击文本字段而触发),但我认为这是从标题中假设的。

我也试过这里给出的解决方案(也不起作用):Editable JCombobox mouseclicked event not working

EDIT2:我尝试了以下方法,但点击仍然没有输出:

try {
    Field popupInBasicComboBoxUI = BasicComboBoxUI.class.getDeclaredField("popup");
    popupInBasicComboBoxUI.setAccessible(true);
    BasicComboPopup popup = (BasicComboPopup)popupInBasicComboBoxUI.get(attachedCB.getUI());

    Field scrollerInBasicComboPopup = BasicComboPopup.class.getDeclaredField("scroller");
    scrollerInBasicComboPopup.setAccessible(true);
    JScrollPane scroller = (JScrollPane)scrollerInBasicComboPopup.get(popup);

    scroller.getViewport().getView().addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        System.out.println("nope");
      }
    });
  }
  catch (IllegalAccessException e) {
    e.printStackTrace();
  }
  catch (NoSuchFieldException e) {
    e.printStackTrace();
  }

希望对您有所帮助,

jComboBox.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jComboBoxMouseClicked(evt);//your logic here
            }            
        });

你应该使用 java.awt.event.ActionEvent,这是(引用自 javadoc)a

semantic event which indicates that a component-defined action occurred. This high-level event is generated by a component (such as a Button) when the component-specific action occurs (such as being pressed)...

像这样:

        jComboBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                javax.swing.JComboBox source = (javax.swing.JComboBox)evt.getSource();
                // use getSelectedIndex to know the item if needed
                labelTextField.setText(source.getSelectedItem().toString());
            }
        }); 

注意 getSelectedItemgetSelectedIndexgetSelectedObjects 方法:这可以让您知道哪个项目已选择并只处理您想要的项目

我在评论中发布的 link 你错过了将它添加到 scrollPane 的视口视图。

Field scrollerInBasicComboPopup = BasicComboPopup.class.getDeclaredField("scroller");
scrollerInBasicComboPopup.setAccessible(true);
JScrollPane scroller = (JScrollPane) scrollerInBasicComboPopup.get(popup);
scroller.getViewport().getView().addMouseListener(listener);