如何在JavaFX中使用时间线进行双击?

如何在JavaFX中使用时间线进行双击?,java,javafx,java-8,Java,Javafx,Java 8,这就是我到目前为止所做的,它工作得很好,但是当我双击时,双击事件被激发,而单击事件被激发,当我单击时,当然只有单击被激发 long currentMillis = System.currentTimeMillis(); addEventFilter(MouseEvent.MOUSE_CLICKED, e -> { long currentClickedMillis = System.currentTimeMillis(); long diffMillis = currentCl

这就是我到目前为止所做的,它工作得很好,但是当我双击时,双击事件被激发,而单击事件被激发,当我单击时,当然只有单击被激发

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));                   
  }
});

堆栈溢出的其他解决方案不起作用!他们只是计算点击次数,但仍然存在与我现在相同的问题。

我曾经遇到过相同的问题,但也找不到解决方案,因此我必须开发自己的解决方案。
为此,我使用了JavaFX的代码>时间线< /Cord>,这将给你在第一次点击时启动时间线的能力,这取决于如果你再点击第二次点击,它会被认为是单次点击或双击,但不会同时发生。 以下是我的解决方案:

// 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;
});

               

注意:在双击和单击时做完全不同的事情是不好的!通常情况下,双击会增强/扩大单键。@kleopatra但双击也会触发单键事件并不违反直觉?@Elmehdi否,这取决于客户端应用程序来区分:)典型的良好UX f.i.是单选、双启动编辑。第一次开始编辑,第二次删除项目是错误的。。因此,我对这样一个问题的第一个看法是重新思考用户体验(与技术上独立的单/双-这是可能的,正如您的答案正确地表明的那样:)