在 javafx 中创建长按或按下按钮的方法
Create a method for a long click or pressed Button in javafx
在我的程序中,我需要在按钮很长时执行操作 pressed/click。所以我决定创建一个方法,在按钮点击时间超过 1 秒时获取按钮参数和 return 布尔值:
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 方法中获取布尔值,如果它是 "pressed" 调用一个函数来做某事?
编辑!非常完美,谢谢!
只使用开始和结束时间怎么样:
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");
}
}
});
AnimationTimer中handle
方法的time
参数是timestamp当前帧的,单位为纳秒。因此,您不应将 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();
}
}
});
}
在我的程序中,我需要在按钮很长时执行操作 pressed/click。所以我决定创建一个方法,在按钮点击时间超过 1 秒时获取按钮参数和 return 布尔值:
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 方法中获取布尔值,如果它是 "pressed" 调用一个函数来做某事?
编辑!非常完美,谢谢!
只使用开始和结束时间怎么样:
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");
}
}
});
AnimationTimer中handle
方法的time
参数是timestamp当前帧的,单位为纳秒。因此,您不应将 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();
}
}
});
}