在JavaSwing中,当用户通过鼠标单击提交JComboBox选择时,如何检测?

在JavaSwing中,当用户通过鼠标单击提交JComboBox选择时,如何检测?,java,swing,drop-down-menu,mouse,jcombobox,Java,Swing,Drop Down Menu,Mouse,Jcombobox,我花了一天多的时间想弄明白这一点。我已经尝试了MouseListener、ItemListener和ActionListener的例子,但没有一个能满足我的需要 以下是我得到的:我有一个运行良好的JComboBox。用户可以输入文本框,文本框会自动完成,并且有一个下拉列表和所有内容。该框用于执行搜索。用户键入搜索并单击enter键,这将导致在主窗格中突出显示搜索结果。用户还可以通过箭头指向下拉列表,并通过点击下拉列表中的enter键启动结果高亮显示 问题是:用户可以单击文本字段下下拉列表中的一个

我花了一天多的时间想弄明白这一点。我已经尝试了MouseListener、ItemListener和ActionListener的例子,但没有一个能满足我的需要

以下是我得到的:我有一个运行良好的JComboBox。用户可以输入文本框,文本框会自动完成,并且有一个下拉列表和所有内容。该框用于执行搜索。用户键入搜索并单击enter键,这将导致在主窗格中突出显示搜索结果。用户还可以通过箭头指向下拉列表,并通过点击下拉列表中的enter键启动结果高亮显示

问题是:用户可以单击文本字段下下拉列表中的一个项目,文本字段将填充该值,但搜索结果不会突出显示。用户在单击所需内容后仍然必须按enter键

以下是我想要的:我想要检测用户单击他们想要的下拉菜单项的时刻,以便我可以使用该事件调用我的方法,该方法在主窗格中突出显示结果。我不希望他们在单击下拉列表中的某个项目后必须按enter键

我有一个键适配器,它捕捉回车键,调用方法,突出显示结果,效果很好。它调用的方法称为seekAll()

当我尝试鼠标侦听器时,它似乎只对文本字段有效,而对下拉列表无效。当我尝试使用ItemListener时,我无法区分高亮显示/悬停/箭头指向的项目和单击进行下拉菜单选择的项目。操作侦听器的结果与我尝试使用ItemListener的结果类似

下面是我尝试的ActionListener的一个示例:

public abstract class HeaderFinderBox {
    private WideComboBox searchTermBox;
    public HeaderFinderBox() {
        final String[] labels = setupData();
        //just returns an array of strings

        this.searchTermBox = GUIFactory.createWideComboBox(labels);
        searchTermBox.setEditable(true);
        searchTermBox.setBorder(null);
        searchTermBox.setBackground(GUIFactory.DARK_BG);
        AutoCompleteDecorator.decorate(searchTermBox);

        //This adds my key listener
        //searchTermBox.getEditor().getEditorComponent()
        //      .addKeyListener(new BoxKeyListener());

        searchTermBox.addActionListener(new SearchListener());
    }

    class SearchListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            LogBuffer.println("Action performed on item from the combo box");
            //seekAll();
        }
    }
}
我对seekAll()的调用进行了注释,因为当您在文本框中键入第一个字符并且字段为空时,会出现空指针异常。注释掉该调用后,每当发生以下情况时,我就会收到“从组合框对项目执行的操作”消息:

  • 键盘上键入的每个字符两次
  • 当你按回车键的时候
  • 单击下拉列表中的某个项目时,单击3次
  • 将箭头指向下拉列表中的某个项目,然后按enter键后3次
  • 我唯一想要一个钩子来做某件事的是,当用户单击下拉列表中的某个项目时,1触发。这将是上面列表中的第3个,但它一次单击就触发3次。我如何将该事件与所有其他事件(1、2和4)区分开来


    如果ActionListener应该只能在单击下拉列表中的某个项目时给我一个操作,那么我做错了什么?

    也许您要找的是一个
    焦点侦听器
    JComboBox.addFocusListener()
    Hmmm,焦点侦听器似乎用于检测组件何时获得/失去键盘焦点。我想检测下拉菜单上的点击。啊,是的,你说得对,对不起。但是我很确定它应该是
    ActionListener
    你确定你做得对吗?使用ActionListener,它会告诉你所选值何时更改。你能提供一个可以运行的例子来演示你的问题吗好吧,让我回到ActionListener。我肯定我一定做错了什么。让我来实现它,然后我将发布代码并描述出错的地方……也许您正在寻找的是一个
    焦点侦听器
    JComboBox.addFocusListener()
    Hmmm,焦点侦听器似乎用于检测组件何时获得/失去键盘焦点。我想检测下拉菜单上的点击。啊,是的,你说得对,对不起。但是我很确定它应该是
    ActionListener
    你确定你做得对吗?使用ActionListener,它会告诉你所选值何时更改。你能提供一个可以运行的例子来演示你的问题吗好吧,让我回到ActionListener。我肯定我一定做错了什么。让我来实现它,然后我会发布代码,并描述出错的地方。。。