Esto es lo que he hecho hasta ahora, funciona bien, pero cuando hago doble clic, se activa el evento de doble clic y se activa el evento de un solo clic, cuando hago un solo clic solo se activa el único clic, por supuesto.
long currentMillis = System.currentTimeMillis(); addEventFilter(MouseEvent.MOUSE_CLICKED, e -> { long currentClickedMillis = System.currentTimeMillis(); long diffMillis = currentClickedMillis - currentMillis; currentMillis = currentClickedMillis; if (diffMillis > 500) { fireEvent(new FlightListEvents(FlightListEvents.FLIGHT_BUTTON_CLICKED, this.aircraft)); } else { fireEvent(new FlightListEvents(FlightListEvents.FLIGHT_BUTTON_DOUBLE_CLICKED, this.aircraft)); } });¡Las otras soluciones en Stack Overflow no funcionan! Solo cuentan el número de clics y todavía tienen el mismo problema que tengo ahora.
Tuve el mismo problema una vez y tampoco pude encontrar la solución, así que tuve que desarrollar mi propia solución.
Para eso, utilicé la línea de Timeline de Javafx, que le dará la posibilidad de iniciar una línea de tiempo con su primer clic y, dependiendo de si luego hace un segundo clic o no, considerará que es un solo clic o un doble clic. , pero nunca los dos al mismo tiempo.
Aquí está mi solución:
// initialize your timeline final Timeline clickTimeline = new Timeline(); // minimum duration of a double click 500ms Duration clickDuration = Duration.millis(500); KeyFrame clickKeyFrame = new KeyFrame(clickDuration); boolean isClickTimelinePlaying = false; clickTimeline.getKeyFrames().add(clickKeyFrame); addEventFilter(MouseEvent.MOUSE_CLICKED, e -> { if (isClickTimelinePlaying) { // when clicking the second time before the time line finishes isClickTimelinePlaying = false; fireEvent(new FlightListEvents(FlightListEvents.FLIGHT_BUTTON_DOUBLE_CLICKED, this.aircraft)); clickTimeline.stop(); } else { // when clicking for the first time isClickTimelinePlaying = true; // start the timeline clickTimeline.play(); }); } // if timeline finises without receiving a second click, consider it a single click clickTimeline.setOnFinished(event -> { fireEvent(new FlightListEvents(FlightListEvents.FLIGHT_BUTTON_CLICKED, this.aircraft)); isClickTimelinePlaying = false; });