【问题标题】:Create a method for a long click or pressed Button in javafx在 javafx 中为长按或按下按钮创建方法
【发布时间】:2018-02-06 21:45:31
【问题描述】:

在我的程序中,我需要在长按/单击按钮时执行操作。所以我决定创建一个方法,在其参数中获取按钮并在按钮单击超过 1 秒时返回一个布尔值:

public class EventOperations {

JFXButton button;
boolean result = false;

// Button long click
public EventOperations(JFXButton btn) {
    button = btn;
}

public void isLongPressed() {

    final AnimationTimer timer = new AnimationTimer() {

    private long lastUpdate = 0;

    @Override
    public void handle(long time) {
        if (this.lastUpdate > 2000000000) {
            result = true;
            System.out.println("PRESSED !!!!!!!!!");
        }
        this.lastUpdate = time;
    }
    };

    button.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
                timer.start();
            } else {
                timer.stop();
            }
        }
    });

}

public boolean getIsPressed() {
    return result;
}

}

MAIN.JAVA

EventOperations buttonPressed = new EventOperations(jfxButtonFolder);
buttonPressed.isLongPressed();

但每次我快速单击按钮时,它都会显示几个“PRESSED !!!”所以它不起作用。 2000000000 就是一个例子。 我该怎么做才能在我的主要 java 方法中获取布尔值,如果它被“按下”调用一个函数来做某事?

编辑!非常好用,谢谢!

【问题讨论】:

    标签: class javafx click long-integer pressed


    【解决方案1】:

    只使用开始和结束时间怎么样:

    button.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
    
            long startTime;
    
            @Override
            public void handle(MouseEvent event) {
                if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
                    startTime = System.currentTimeMillis();
                } else if (event.getEventType().equals(MouseEvent.MOUSE_RELEASED)) {
                    if (System.currentTimeMillis() - startTime > 2 * 1000) {
                        System.out.println("Pressed for at least 2 seconds (" + (System.currentTimeMillis() - startTime) + " milliseconds)");
                    } else
                        System.out.println("Pressed for " + (System.currentTimeMillis() - startTime) + " milliseconds");
                }
            }
        });
    

    【讨论】:

      【解决方案2】:

      AnimationTimerhandle 方法的time 参数是当前帧的时间戳,以纳秒为单位。因此,您不应将 lastUpdate 设置为此值并将其与所需的鼠标按住间隔进行比较。

      您应该记录在参数lastUpdate 中单击鼠标时的时间戳,并且handle 事件应该检查​​当前时间与lastUpdate 之间的差异,以查看它是否大于您的鼠标按住间隔。

      生成的代码如下所示:

      public void isLongPressed() {
      
          final AnimationTimer timer = new AnimationTimer() {
      
          private long lastUpdate = 0;
      
          @Override
          public void handle(long time) {
              if (Instant.now() - lastUpdate > 2000000000) {
                  result = true;
                  System.out.println("PRESSED !!!!!!!!!");
              }
              stop();
          }
      
          @Override
          public void start() {
              super.start();
              lastUpdate = Instant.now(); // Assuming you are using Java 9
          }
          };
      
          button.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
      
              @Override
              public void handle(MouseEvent event) {
                  if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
                      timer.start();
                  } else {
                      timer.stop();
                  }
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多