2010-10-29 6 views

ответ

76
public void mouseClicked(MouseEvent event) 
{ 
    if (event.getClickCount() == 2) { 
    System.out.println("double clicked"); 
    } 
} 
+2

Вы, вероятно, захотите проверить 'event.getButton() == MouseEvent.BUTTON1', а также только двойные щелчки с помощью левой кнопки мыши. –

16

Предполагая, что вы имеете в виду в свинге, назначить MouseListener вашей компоненты:

addMouseListener(new MouseAdapter(){ 
    @Override 
    public void mouseClicked(MouseEvent e){ 
     if(e.getClickCount()==2){ 
      // your code here 
     } 
    } 
}); 

Ссылка:

14

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 и совершенным.

+0

Интеллектуальное использование «Таймера» для отмены флага, более сложного, чем сравнение между двумя моментами, но более простое в использовании. Недостаток, который я вижу, заключается в следующем: где хранить 'isAlreadyOneClick'? Кажется, приносит проблемы, решая друг друга. Это решение также будет иметь «дыры» в своем поведении, если (предположим), клики выполняются очень быстро: каждый раз, когда «Таймер» сбрасывает флаг и только в это время будет выполняться правильный двойной щелчок. Кроме того, я думаю, что этот метод не является GC и ресурсами. – Benj

+0

Hello Benj Мне не удается понять связь между сборщиком мусора и флагом. Считаете ли вы, что способ продолжения может что-то сломать? Пожалуйста, не могли бы вы точно указать ваш пример и его последствия? Извините, я не вижу, что вы пытаетесь показать. – davidxxx

+2

Есть две вещи, которые я вижу: 1/Это просто, что каждый раз, когда будет запущена часть «else», будет создан новый объект «Timer». Я бы переместил этот таймер в качестве поля объекта, чтобы можно было управлять им из других мест, таких как щелчок правой кнопкой мыши или несколько. 2/Эти таймеры будут разворачивать двойной щелчок каждые 500 мс, тогда, если вам нужно дважды щелкнуть дважды, есть вероятность, что последний не будет работать должным образом. – Benj