我想记录'用户活动'。我正在努力记录用户触发的事件,组合框的选定值已被更改(由用户更改,而不是通过应用程序调用{{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);
}
}
永远不会打印出来。
如何过滤掉以编程方式生成的事件?
答案 0 :(得分:1)
使用以下方法getItemSelectable()
它会返回事件的发起人。 Documentation
ItemSelectable itemOrginator = e.getItemSelectable()
itemOrginator 是事件的对象来源。
并使用从int userOriginType
类继承的int progOriginType
方法检查getID
和java.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
知道了吗?