代码之家  ›  专栏  ›  技术社区  ›  mtnp

在javafx中创建长时间单击或按下按钮的方法

  •  1
  • mtnp  · 技术社区  · 7 年前

    在我的程序中,我需要在长按/单击按钮时执行操作。因此,我决定创建一个方法,该方法可以获取按钮的参数,并在按钮单击时间超过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;
    }
    

    }

    主要。JAVA

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

    但每次我快速点击按钮,它都会显示几个“按下!!!”所以它不起作用。2000000000的数字就是一个例子。 如何在主java方法中获取布尔值,如果“按下”该如何调用函数?

    编辑!很好,谢谢你!

    2 回复  |  直到 7 年前
        1
  •  3
  •   huidube    7 年前

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

    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
  •  0
  •   rochy_01    7 年前

    这个 time 的参数 handle 中的方法 AnimationTimer 时间戳 以纳秒为单位给出的当前帧的。因此,您不应该设置 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();
                }
            }
        });
    }