2012-06-08 2 views

ответ

72

Да, вы можете обнаружить одиночные, двойные даже несколько кликов:

myNode.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent mouseEvent) { 
     if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){ 
      if(mouseEvent.getClickCount() == 2){ 
       System.out.println("Double clicked"); 
      } 
     } 
    } 
}); 

MouseButton.PRIMARY используется, чтобы определить, (обычно) кнопку левой кнопкой мыши вызывается событие. Прочтите api getClickCount(), чтобы сделать вывод, что, возможно, несколько кликов, кроме одного или двух. Однако мне трудно различать события одиночного и двойного кликов. Потому что первый щелчок мышью двойного клика также увеличит одно событие.

+0

@uluk biy о обработчике onAction, который зарегистрирован в моем файле fxml и вызывается, когда нажимается кнопка. Сможет ли этот обработчик столкнуться с ним? – likejiujitsu

+1

@ Аниль. Нет, не будет. Кнопка может иметь как обработчики событий onAction, так и onMouseClicked. Эти события будут инициироваться, как говорит API-интерфейс каждого из них. –

+0

@uluk biy должен обрабатывать код с одним кликом в onAction обработчике и двойной щелчок в обработчике мыши? – likejiujitsu

16

Не работает, если вы хотите, чтобы справиться с одним щелчком мыши и двойные щелчки, добавив

if(mouseEvent.getClickCount() == 2) 
{ 
    System.out.println("Doubleclicked"); 
} 
else if(mouseEvent.getClickCount() == 1) 
{ 
    System.out.println("Single clicked"); 
} 

Результаты в: "Single clicked" всегда увольняют.

2

Вот как я реализовал двойной щелчок

if (e.getEventType().equals(MouseEvent.MOUSE_CLICKED) && !drag_Flag) { 
       long diff = 0; 
      if(time1==0) 
      time1=System.currentTimeMillis(); 
      else 
      time2=System.currentTimeMillis(); 
      if(time1!=0 && time2!=0) 
      diff=time2-time1; 
      if((diff/1000)<=215 && diff>0) 
      { 
       isdblClicked=true; 
      } 
      else 
      { 
       isdblClicked=false; 
      } 

      System.out.println("IsDblClicked()"+isdblClicked); 

}

+0

Я думаю, что важно учитывать время, прошедшее между щелчками. Я включил бы порядок внутри вашего if-предложения, как это: 'if (diff> 0 && (diff/1000) <= 215)' – Wingie

6

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

import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class DoubleClickDetectionTest extends Application { 

    boolean dragFlag = false; 

    int clickCounter = 0; 

    ScheduledThreadPoolExecutor executor; 

    ScheduledFuture<?> scheduledFuture; 

    public DoubleClickDetectionTest() { 
     executor = new ScheduledThreadPoolExecutor(1); 
     executor.setRemoveOnCancelPolicy(true); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     StackPane root = new StackPane(); 

     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 

     root.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent e) { 
       if (e.getButton().equals(MouseButton.PRIMARY)) { 
        dragFlag = true; 
       } 
      } 
     }); 

     root.setOnMouseClicked(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent e) { 
       if (e.getButton().equals(MouseButton.PRIMARY)) { 
        if (!dragFlag) { 
         System.out.println(++clickCounter + " " + e.getClickCount()); 
         if (e.getClickCount() == 1) { 
          scheduledFuture = executor.schedule(() -> singleClickAction(), 500, TimeUnit.MILLISECONDS); 
         } else if (e.getClickCount() > 1) { 
          if (scheduledFuture != null && !scheduledFuture.isCancelled() && !scheduledFuture.isDone()) { 
           scheduledFuture.cancel(false); 
           doubleClickAction(); 
          } 
         } 
        } 
        dragFlag = false; 
       } 
      } 
     }); 
    } 

    @Override 
    public void stop() { 
     executor.shutdown(); 
    } 

    private void singleClickAction() { 
     System.out.println("Single-click action executed."); 
    } 

    private void doubleClickAction() { 
     System.out.println("Double-click action executed."); 
    } 
} 
3

Ответ P. Pandey - это самый простой подход, который фактически отличает однократный и двойной щелчок, но для меня это не сработало. Во-первых, функция currentTimeMillis уже возвращает миллисекунды, поэтому деление на 1000 не кажется необходимым. Версия ниже работала для меня более последовательно.

@Override 
public void handle(MouseEvent t) { 

     long diff = 0; 

     currentTime=System.currentTimeMillis(); 

     if(lastTime!=0 && currentTime!=0){ 
      diff=currentTime-lastTime; 

      if(diff<=215) 
       isdblClicked=true; 
      else 
       isdblClicked=false; 
     } 

     lastTime=currentTime; 

     System.out.println("IsDblClicked()"+isdblClicked); 

     //use the isdblClicked flag... 
} 
0

Придерживаясь Java SE 8 лямбда-выражений будет выглядеть примерно так:

node.setOnMouseClicked(event -> { 
    if(event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) { 
     handleSomeAction(); 
    } 
}); 

После того, как вы привыкнете к лямбда-выражения - они в конечном итоге более понятным, чем исходный класс экземпляра и переопределения (х). - На мой взгляд -

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