На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Бездействие пользователя , Можно ли определить?
    Идея такая: создать таймер, который бы отсчитывал время, а в случае какого-либо действия пользователя, сбрасывал бы его (нажатие на клавишу клавиатуры, движение мыши). Если брать, к примеру, С++, делфи, то можно брать это событие из WinApi. А как быть с явой, есть ли у нее такая функция, подскажите пожалуйста?
    Отслеживать нажатие на клавишу, движение мыши в слушателях в программе громоздко и выглядит глупо... Тем более моя программа многооконная, и как вы понимаете, слушателей ОЧЕНЬ много...
    Сообщение отредактировано: Большой Синий Кит -
      У меня есть два предложения.

      1. Создать базовые классы слушателей, а существующие - отнаследовать от них. Много слушателей? Но нужно всегда стараться делать код эластичным. Я, например, обычно пишу фабрики Listener'ов.

      2. Копнуть глубже. Есть такой класс: EventQueue. Все события так или иначе поступают в него. Заменить текущий его потомком можно методом EventQueue.push(EventQueue).
      Далее, у потомка переопределяем метод dispatchEvent(AWTEvent) следующим образом:

      ExpandedWrap disabled
        protected void dispatchEvent(AWTEvent event) {
         // проверка на нужный тип и действия
         super.dispatchEvent(event);
        }


      Но я так не делал и не знаю, будет ли работать ;)
        Grab[SSAU], пожалуй, не пойдёт. Для того, чтобы определить неактивность пользователя, следует слушать все события ввода в системе. В java нет такого механизма.
          wind, активность в системе - да, нет такого механизма (ибо кросс-платформенность).

          Я думал активность в программе. Поправьте меня если я не прав, но, по-моему, активность в программе определяется всеми низкоуровневыми событиями в AWT.
            Цитата Grab[SSAU] @
            У меня есть два предложения.

            1. Создать базовые классы слушателей, а существующие - отнаследовать от них. Много слушателей? Но нужно всегда стараться делать код эластичным. Я, например, обычно пишу фабрики Listener'ов.

            2. Копнуть глубже. Есть такой класс: EventQueue. Все события так или иначе поступают в него. Заменить текущий его потомком можно методом EventQueue.push(EventQueue).
            Далее, у потомка переопределяем метод dispatchEvent(AWTEvent) следующим образом:

            ExpandedWrap disabled
              protected void dispatchEvent(AWTEvent event) {
               // проверка на нужный тип и действия
               super.dispatchEvent(event);
              }


            Но я так не делал и не знаю, будет ли работать ;)

            Вот спасибо!!! :)
            Даже проще можно, благодаря Вашему упоминанию EventQueue.
            EventQueue.getCurrentEvent() - дает текущее событие... если его нет, соответственно null :) Таким образом и можно определить, пожалуй.

            Да, мне подойдет ТОЛЬКО в программе слушать... Запущу теперь таймер с проверкой на null. Должно сработать, думаю...Или как Вы думаете?

            Добавлено
            Нет, в отдельном процессе метод всегда выдает null :(
            Сообщение отредактировано: Большой Синий Кит -
              Цитата Большой Синий Кит @
              Да, мне подойдет ТОЛЬКО в программе слушать...

              В таком случае всё это делается несколько проще:

              ExpandedWrap disabled
                class InputEventListener implements AWTEventListener {
                 
                    public void eventDispatched(AWTEvent event) {
                                
                    }
                            
                }
                        
                Toolkit.getDefaultToolkit().addAWTEventListener(
                    new InputEventListener(), AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK
                );
                Цитата wind @
                Цитата Большой Синий Кит @
                Да, мне подойдет ТОЛЬКО в программе слушать...

                В таком случае всё это делается несколько проще:

                ExpandedWrap disabled
                  class InputEventListener implements AWTEventListener {
                   
                      public void eventDispatched(AWTEvent event) {
                                  
                      }
                              
                  }
                          
                  Toolkit.getDefaultToolkit().addAWTEventListener(
                      new InputEventListener(), AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK
                  );

                Работает!!! Я поражаюсь, как же можно столько всего знать! :)
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0283 ]   [ 14 queries used ]   [ Generated: 17.05.24, 10:51 GMT ]