如何过滤以编程方式生成的事件?

时间:2012-12-05 15:23:19

标签: java swing jcombobox itemlistener

我想记录'用户活动'。我正在努力记录用户触发的事件,组合框的选定值已被更改(由用户更改,而不是通过应用程序调用{​​{1}}或类似的东西)。

以下是我到目前为止所做的事情:我为combo.setSelectedItem()

注册ItemListener
JComboBox

但是,即使comboBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { log(USER_SELECTED_ITEM, e); } } }); 以编程方式选择了组合框值,也会调用itemStateChanged(...)

我还找到了一个布尔字段comboBox.setSelectedItem(...),当通过显式调用AWTEvent.isSystemGenerated生成事件时,我希望它是true

comboBox.setSelectedItem(...)

不幸的是, @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { boolean sysGen = AWTAccessor.getAWTEventAccessor().isSystemGenerated(e); System.out.println("system generated: " + sysGen); } } 永远不会打印出来。

如何过滤掉以编程方式生成的事件?

2 个答案:

答案 0 :(得分:1)

使用以下方法getItemSelectable() 它会返回事件的发起人。 Documentation

ItemSelectable itemOrginator = e.getItemSelectable()

itemOrginator 是事件的对象来源。

并使用从int userOriginType类继承的int progOriginType方法检查getIDjava.awt.AWTEvent两种情况。

答案 1 :(得分:0)

简单。从系统中定义一个golbal变量。

comboBox.addItemListener(new ItemListener() 
{
   @Override
   public void itemStateChanged(ItemEvent e) 
   {
      if (e.getStateChange() == ItemEvent.SELECTED) 
      {
           if(!fromSystem)
           {
               log(USER_SELECTED_ITEM, e);
           }
      }
   }

});

现在你在哪里写过comboBox.setSelectedItem(...)用以下3行代替这一行。

fromSystem = true;
comboBox.setSelectedItem(...);
fromSystem = false

知道了吗?