Я хотел бы узнать, удалось ли обнаружить двойной щелчок в JavaFX 2? и как ?Javafx 2 клик и двойной щелчок
Я бы хотел сделать разное событие между щелчком и двойным щелчком.
Благодаря
Я хотел бы узнать, удалось ли обнаружить двойной щелчок в JavaFX 2? и как ?Javafx 2 клик и двойной щелчок
Я бы хотел сделать разное событие между щелчком и двойным щелчком.
Благодаря
Да, вы можете обнаружить одиночные, двойные даже несколько кликов:
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()
, чтобы сделать вывод, что, возможно, несколько кликов, кроме одного или двух. Однако мне трудно различать события одиночного и двойного кликов. Потому что первый щелчок мышью двойного клика также увеличит одно событие.
Не работает, если вы хотите, чтобы справиться с одним щелчком мыши и двойные щелчки, добавив
if(mouseEvent.getClickCount() == 2)
{
System.out.println("Doubleclicked");
}
else if(mouseEvent.getClickCount() == 1)
{
System.out.println("Single clicked");
}
Результаты в: "Single clicked"
всегда увольняют.
Вот как я реализовал двойной щелчок
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);
}
Я думаю, что важно учитывать время, прошедшее между щелчками. Я включил бы порядок внутри вашего if-предложения, как это: 'if (diff> 0 && (diff/1000) <= 215)' – Wingie
Вот еще один кусок кода, который может быть использован, если вы должны различать между одно- и двойным щелчком мыши и имеют предпринять конкретные действия в любом случае.
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.");
}
}
Ответ 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...
}
Придерживаясь Java SE 8 лямбда-выражений будет выглядеть примерно так:
node.setOnMouseClicked(event -> {
if(event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
handleSomeAction();
}
});
После того, как вы привыкнете к лямбда-выражения - они в конечном итоге более понятным, чем исходный класс экземпляра и переопределения (х). - На мой взгляд -
@uluk biy о обработчике onAction, который зарегистрирован в моем файле fxml и вызывается, когда нажимается кнопка. Сможет ли этот обработчик столкнуться с ним? – likejiujitsu
@ Аниль. Нет, не будет. Кнопка может иметь как обработчики событий onAction, так и onMouseClicked. Эти события будут инициироваться, как говорит API-интерфейс каждого из них. –
@uluk biy должен обрабатывать код с одним кликом в onAction обработчике и двойной щелчок в обработчике мыши? – likejiujitsu