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
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
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ẻ.
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.
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);
}
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
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.");
}
}
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...
}
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-
@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
@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. –
@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