【问题标题】:How can I use timeline for double click in JavaFX? [duplicate]如何使用时间轴在 JavaFX 中双击? [复制]
【发布时间】:2021-03-10 04:24:37
【问题描述】:

这是我到目前为止所做的,它工作得很好,但是当我双击时,会触发双击事件并触发单击事件,当我单击时当然只会触发单击事件。

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

Stack Overflow 上的其他解决方案不起作用!他们只是计算点击次数,但仍然遇到我现在遇到的同样问题。

【问题讨论】:

  • 当心:为双击而不是单击做一些完全不同的事情是糟糕的用户体验!通常,双重应该增强/扩大单一。
  • @kleopatra 但双击触发单击事件是否违反直觉?
  • @Elmehdi 不,这取决于客户端应用程序来区分:) 典型的良好 UX f.i.是单选、双启动编辑。不好的是首先开始编辑,第二个删除项目..所以我第一次解决这样的问题是重新考虑用户体验(相对于技术上单独的单/双 - 这是可能的,正如你的回答正确表明的那样:)

标签: java javafx java-8


【解决方案1】:

我曾经遇到过同样的问题,也找不到解决方案,所以我不得不开发自己的解决方案。
为此,我使用了 Javafx 的 Timeline,这将使您能够在第一次单击时开始时间线,并且取决于您之后是否进行第二次单击,它会认为它是单击或单击双击,但不要同时双击。
这是我的解决方案:

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

               

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多