В Java, что событие *непрерывно*, стрелял в кнопку мыши вниз?

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

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

И это об этом. Какая-либо идея, как сделать такое событие?

Удачи

jy

5
задан Jean-Yves 30 December 2009 в 10:45
поделиться

5 ответов

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

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

Если у Вас нет отдельного потока и Вы не хотите, чтобы это происходило, то таймер - это, пожалуй, самый простой способ. javadoc на 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
}

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

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

.
5
ответ дан 18 December 2019 в 07:29
поделиться

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

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

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

.
8
ответ дан 18 December 2019 в 07:29
поделиться

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

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

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

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

.
7
ответ дан 18 December 2019 в 07:29
поделиться

Нет такого события

Вы можете создать свое собственное, запустив таймер в мышином режиме и закончив тем же самым таймером в мышином режиме

Вам также понадобится несколько сбережений, чтобы убедиться, что таймер останавливается, когда вы делаете мышиный переход на другой компонент или даже на другой кадр или не java gui части

.
1
ответ дан 18 December 2019 в 07:29
поделиться

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

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

.
0
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: