Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.0.89] |
|
Сообщ.
#1
,
|
|
|
Идея такая: создать таймер, который бы отсчитывал время, а в случае какого-либо действия пользователя, сбрасывал бы его (нажатие на клавишу клавиатуры, движение мыши). Если брать, к примеру, С++, делфи, то можно брать это событие из WinApi. А как быть с явой, есть ли у нее такая функция, подскажите пожалуйста?
Отслеживать нажатие на клавишу, движение мыши в слушателях в программе громоздко и выглядит глупо... Тем более моя программа многооконная, и как вы понимаете, слушателей ОЧЕНЬ много... |
Сообщ.
#2
,
|
|
|
У меня есть два предложения.
1. Создать базовые классы слушателей, а существующие - отнаследовать от них. Много слушателей? Но нужно всегда стараться делать код эластичным. Я, например, обычно пишу фабрики Listener'ов. 2. Копнуть глубже. Есть такой класс: EventQueue. Все события так или иначе поступают в него. Заменить текущий его потомком можно методом EventQueue.push(EventQueue). Далее, у потомка переопределяем метод dispatchEvent(AWTEvent) следующим образом: protected void dispatchEvent(AWTEvent event) { // проверка на нужный тип и действия super.dispatchEvent(event); } Но я так не делал и не знаю, будет ли работать |
Сообщ.
#3
,
|
|
|
Grab[SSAU], пожалуй, не пойдёт. Для того, чтобы определить неактивность пользователя, следует слушать все события ввода в системе. В java нет такого механизма.
|
Сообщ.
#4
,
|
|
|
wind, активность в системе - да, нет такого механизма (ибо кросс-платформенность).
Я думал активность в программе. Поправьте меня если я не прав, но, по-моему, активность в программе определяется всеми низкоуровневыми событиями в AWT. |
Сообщ.
#5
,
|
|
|
Цитата Grab[SSAU] @ У меня есть два предложения. 1. Создать базовые классы слушателей, а существующие - отнаследовать от них. Много слушателей? Но нужно всегда стараться делать код эластичным. Я, например, обычно пишу фабрики Listener'ов. 2. Копнуть глубже. Есть такой класс: EventQueue. Все события так или иначе поступают в него. Заменить текущий его потомком можно методом EventQueue.push(EventQueue). Далее, у потомка переопределяем метод dispatchEvent(AWTEvent) следующим образом: protected void dispatchEvent(AWTEvent event) { // проверка на нужный тип и действия super.dispatchEvent(event); } Но я так не делал и не знаю, будет ли работать Вот спасибо!!! Даже проще можно, благодаря Вашему упоминанию EventQueue. EventQueue.getCurrentEvent() - дает текущее событие... если его нет, соответственно null Таким образом и можно определить, пожалуй. Да, мне подойдет ТОЛЬКО в программе слушать... Запущу теперь таймер с проверкой на null. Должно сработать, думаю...Или как Вы думаете? Добавлено Нет, в отдельном процессе метод всегда выдает null |
Сообщ.
#6
,
|
|
|
Цитата Большой Синий Кит @ Да, мне подойдет ТОЛЬКО в программе слушать... В таком случае всё это делается несколько проще: class InputEventListener implements AWTEventListener { public void eventDispatched(AWTEvent event) { } } Toolkit.getDefaultToolkit().addAWTEventListener( new InputEventListener(), AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK ); |
Сообщ.
#7
,
|
|
|
Цитата wind @ Цитата Большой Синий Кит @ Да, мне подойдет ТОЛЬКО в программе слушать... В таком случае всё это делается несколько проще: class InputEventListener implements AWTEventListener { public void eventDispatched(AWTEvent event) { } } Toolkit.getDefaultToolkit().addAWTEventListener( new InputEventListener(), AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK ); Работает!!! Я поражаюсь, как же можно столько всего знать! |