Как фильтровать события, генерируемые программно?

Я хочу регистрировать "активность пользователя". Я изо всех сил пытаюсь зарегистрировать пользовательское событие, что выбранное значение поля со списком было изменено (пользователем, а не вызовом приложения). 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

Понял??

Другие вопросы по тегам