2012-06-08 42 views
41

Tôi muốn biết liệu có thể phát hiện nhấp đúp trong JavaFX 2 không? và làm thế nào ?Javafx 2 nhấp và nhấp đúp vào

Tôi muốn tạo sự kiện khác giữa nhấp chuột và nhấp đúp.

Cảm ơn

Trả lời

72

Có bạn có thể phát hiện đơn, đôi thậm chí nhiều lần nhấp chuột:

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 được sử dụng để xác định xem bên trái (thường) nút chuột được kích hoạt sự kiện này. Đọc api của getClickCount() để kết luận rằng có thể có nhiều lần nhấp khác với đơn hoặc đôi. Tuy nhiên tôi thấy khó phân biệt giữa các sự kiện nhấp chuột đơn và đôi. Vì số nhấp chuột đầu tiên của nhấp đúp sẽ tăng lên một sự kiện đơn lẻ.

+0

@uluk biy điều gì về trình xử lý onAction được đăng ký trong tệp fxml của tôi và được gọi khi nút được nhấp. Liệu bộ xử lý này có đụng độ với nó không? – likejiujitsu

+1

@Anil. Không nó sẽ không như vậy. Nút có thể có cả trình xử lý sự kiện onAction và onMouseClicked. Các sự kiện này sẽ được kích hoạt dưới dạng tài liệu API của từng sự kiện. –

+0

@uluk biy nên mã xử lý nhấp chuột duy nhất đi trong handler onAction và nhấp đúp chuột trong trình xử lý chuột? – likejiujitsu

16

Không hoạt động nếu bạn muốn xử lý một cú nhấp chuột và nhấp chuột kép bằng cách thêm

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

Kết quả trong: "Single clicked" luôn bị sa thải.

2

Dưới đây là cách tôi đã thực hiện double click

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

Tôi nghĩ rằng điều quan trọng là phải dành thời gian trôi qua giữa các lần nhấp vào tài khoản. Tôi sẽ xoay vòng lệnh trong mệnh đề if của bạn như thế này, mặc dù: 'if (diff> 0 && (diff/1000) <= 215)' – Wingie

6

Dưới đây là một đoạn mã có thể được sử dụng nếu bạn phải phân biệt giữa một đơn và một double-click và có để thực hiện một hành động cụ thể trong cả hai trường hợp.

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

Phản hồi của P. Pandey là cách tiếp cận đơn giản nhất thực sự phân biệt giữa nhấp chuột đơn và nhấp đúp nhưng không hoạt động đối với tôi. Đối với một, hàm "currentTimeMillis" đã trả về mili giây, do đó, chia nó cho 1000 dường như không cần thiết. Các phiên bản dưới đây làm việc cho tôi một cách nhất quán hơn.

@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

Tôn trọng Java SE biểu 8 lambda sẽ giống như thế này:

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

Một khi bạn đã quen với biểu thức lambda - họ kết thúc lên được nhiều điều dễ hiểu so với bản gốc lớp instantiation và trọng (x) phương pháp. -Trong ý kiến ​​của tôi-

Các vấn đề liên quan