Я хочу знать, как мы можем выполнить действие, когда мышь дважды щелкнет в компоненте.идентификация двойного щелчка в java
ответ
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
System.out.println("double clicked");
}
}
Предполагая, что вы имеете в виду в свинге, назначить MouseListener вашей компоненты:
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
// your code here
}
}
});
Ссылка:
- Java Tutorial: How to write a Mouse Listener
e.getClickCount()==2
недостаточно, если вы хотите разрешить своим пользователям делать несколько двойных щелчков за короткую задержку. Вы ограничены конфигурацией рабочего стола. Вы можете получить, посмотрев результат Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
хороший способ обойти эту проблему не использовать getClickCount()
чек, но использовать Timer
, где вы можете выбрать интервал максимум между кликами и обращаться по себе в счет (очень простой).
Код, связанный:
boolean isAlreadyOneClick;
@Override
public void mouseClicked(MouseEvent mouseEvent) {
if (isAlreadyOneClick) {
System.out.println("double click");
isAlreadyOneClick = false;
} else {
isAlreadyOneClick = true;
Timer t = new Timer("doubleclickTimer", false);
t.schedule(new TimerTask() {
@Override
public void run() {
isAlreadyOneClick = false;
}
}, 500);
}
}
Испытано с Win Xp OS и совершенным.
Интеллектуальное использование «Таймера» для отмены флага, более сложного, чем сравнение между двумя моментами, но более простое в использовании. Недостаток, который я вижу, заключается в следующем: где хранить 'isAlreadyOneClick'? Кажется, приносит проблемы, решая друг друга. Это решение также будет иметь «дыры» в своем поведении, если (предположим), клики выполняются очень быстро: каждый раз, когда «Таймер» сбрасывает флаг и только в это время будет выполняться правильный двойной щелчок. Кроме того, я думаю, что этот метод не является GC и ресурсами. – Benj
Hello Benj Мне не удается понять связь между сборщиком мусора и флагом. Считаете ли вы, что способ продолжения может что-то сломать? Пожалуйста, не могли бы вы точно указать ваш пример и его последствия? Извините, я не вижу, что вы пытаетесь показать. – davidxxx
Есть две вещи, которые я вижу: 1/Это просто, что каждый раз, когда будет запущена часть «else», будет создан новый объект «Timer». Я бы переместил этот таймер в качестве поля объекта, чтобы можно было управлять им из других мест, таких как щелчок правой кнопкой мыши или несколько. 2/Эти таймеры будут разворачивать двойной щелчок каждые 500 мс, тогда, если вам нужно дважды щелкнуть дважды, есть вероятность, что последний не будет работать должным образом. – Benj
Вы, вероятно, захотите проверить 'event.getButton() == MouseEvent.BUTTON1', а также только двойные щелчки с помощью левой кнопки мыши. –