2009-12-30 2 views
4

Я хотел бы знать, существует ли на Java событие непрерывно, когда кнопка мыши удерживается (нажата), даже если мышь не перемещается. Я не мог найти его в типичных MouseListeners:В Java, какое событие * непрерывно * срабатывает при нажатии кнопки мыши?

  • MouseDragged обжигают только если пользователь шаг мыши, удерживая нажатой кнопку
  • MousePressed срабатывает только один раз, когда кнопка была нажата

И это все. Любая идея, как сделать такое событие?

Приветствие

JY

+0

Вы уверены, что не имеете в виду несколько раз? Как бы вы справились с бесконечным количеством событий? – robertc

+0

Я подумывал о том, чтобы отправить другую тему, что-то делать, и ждать. Когда поток возвращается, если кнопка все еще включена, сделайте это снова. –

ответ

5

Код Джеймса Гудвина не будет работать.mousePressed и mouseReleased оба запускаются из потока GUI, поэтому блокировка в mousePressed предотвратит запуск mouseReleased из когда-либо, что означает, что цикл будет продолжаться вечно.

Если у вас уже есть отдельный поток для обработки, используйте mousePressed, чтобы указать на тот поток, который должно начаться, и mouseReleased для остановки.

Если у вас нет отдельной нити и вы не хотите хлопот, таймер, вероятно, самый простой способ. javadoc on Timer.

В частности, вы должны создать TimerTask, который делает то, что вы хотите сделать несколько раз и поставить его в очередь с помощью Timer.schedule:

Timer timer = new Timer(); 
TimerTask task = new MyTimerTask(); 

private class MyTimerTask extends TimerTask { 
    public void run() { 
     // your code here 
    } 
} 

public void mousePressed(MouseEvent e) { 
    timer.scheduleAtFixedRate(task, 0, 1000); // Time is in milliseconds 
    // The second parameter is delay before the first run 
    // The third is how often to run it 
} 

public void mouseReleased(MouseEvent e) { 
    task.cancel(); 
    // Will not stop execution of task.run() if it is midway 
    // But will guarantee that after this call it runs no more than one more time 
} 

Я уверен, что это самый простой способ, как это не включает в себя faffing around с межпоточной связью.

О, и, как сказал Петр, вам нужно будет добавить код для учетной записи пользователя, который будет работать на вашем приложении и где-то в другом месте.

+0

Спасибо за указание, что код не будет работать должным образом, я только дал код в качестве грубого примера и не тестировал его на самом деле. –

+0

Это, после некоторых изменений, исправило мою проблему отлично. Благодаря! – Fengson

7

Если вам нужно что-то делать, пока кнопку мыши вниз, просто запустите его, когда вы обнаружили mousePressed событие, а затем непрерывно делать, пока не обнаружит mouseReleased события. Тогда вам не нужно постоянно стрелять в ваше мероприятие. например

public void mousePressed(MouseEvent e) { 
    someCondition = true; 
    while(someCondition) { 
     //do something 
    } 
} 

public void mouseReleased(MouseEvent e) { 
    someCondition = false; 
} 

EDIT: Как уже говорилось, код должен был бы быть отделен от потока события, в противном случае вызов mouseReleased бы получить заблокированной предотвращение петлю от конца.

+0

Возможно, вам захочется отделить от потока обработчика события. –

8

Существует очевидная причина, по которой это событие недоступно в MouseListener: оно будет спамить вас такими событиями, что все замедлится до остановки. Вы хотите получать это событие каждую секунду, каждый мс или даже чаще? Если вам это нужно, вам придется самому это сделать.

Для того, чтобы определить, удерживается ли кнопка в данный момент, вам необходимы mousePressed и mouseReleased. Затем вам нужно запустить какой-то цикл, который генерирует соответствующие события, которые вы хотели бы иметь.

Возможно, вы также захотите работать через опрос, т. Е. Расширить свой класс MouseListener, чтобы он мог сказать вам, остается ли кнопка нажатой, и если вам нужны эти события, вы можете активно опросить кнопку. Это зависит от того, как вы хотите использовать эти события, какой подход более подходит.

1

Там нет такого события

Вы можете создать свой собственный, начиная таймер в методе MouseDown и заканчивая тот же таймер в mousereleased

Вам также потребуется несколько неудача сейв, чтобы убедиться, таймер останавливается, когда вы делаете mousedown movemove на другой компонент или даже на другие элементы фрейма или не java gui.

0

Я думаю, вы найдете ответ «нет», такого события нет. Не только для Java, но и для любого графического интерфейса. Это не будет служить никакой цели, кроме как связать очередь событий.

Вам нужно будет создать свой собственный, заманив мышью вниз, а затем запустив событие таймера с помощью регулярных интервалов до события mouse up.

Смежные вопросы