Как фильтровать события, генерируемые программно?
Я хочу регистрировать "активность пользователя". Я изо всех сил пытаюсь зарегистрировать пользовательское событие, что выбранное значение поля со списком было изменено (пользователем, а не вызовом приложения). 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);
}
}
К несчастью, true
никогда не распечатывается.
Как я могу отфильтровать события, которые генерируются программно?
2 ответа
Используйте следующий метод getItemSelectable()
Возвращает отправителя события. Документация
ItemSelectable itemOrginator = e.getItemSelectable()
itemOrginator является источником объекта события.
и проверьте оба случая int userOriginType
а также int progOriginType
с помощью getID
метод, унаследованный от java.awt.AWTEvent
учебный класс.
Это просто. Определите глобальную переменную из System.
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
Понял??